اذهب إلى المحتوى
  • 0

كيف أرسل بيانات من recycler view متواجد في fragment الى fragment اخرى؟ {يفضل استخدام الكوتلن او جافا }

عبدالرحمن العنزي4

السؤال

السلام عليكم ورحمة الله وبركاته, في تطبيقي لدي Bottom Sheet Fragment وفي داخلها لدي اثنين من نوع Fragments وفي واحده منهما يوجد لدي recycler view  وفي داخلها Button, فعندما يستخدم المستخدم هذا الزر اريد من الزر ان يرسل text view من نوع Title من الـ Fragment الاولى الى الـ Fragment الاخرى وايضا الزر يفتح الfragment الاخرى.

الذي اريدة هو

  • فتح fragment عن طريق button موجود في recycler view داخل الـ Fragment الاولى
  • عندما يتم فتح الـ Fragment أريد ان ارسل لها العنوان المتواجد في recycler view

 

## حاولت استخدام فكرة الـ Transaction بين الـ Fragments  لكن لم أعرف كيف اطبقها بشكل جيد !!

أتمنى ان اكون وفقت في شرح سؤالي بأفضل طريقة ممكنه.. واكون شاكر جدا لمن يجاوب على سؤالي

My recycler view adapter

class tvTitleAdapter (val context: Context,val TITLE_LIST : ArrayList<TvTitlesViewModel>)
    :  RecyclerView.Adapter<tvTitleAdapter.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.tv_titles_design, parent, false)
        return ViewHolder(view)
    }

    override fun getItemCount(): Int {
        return TITLE_LIST.size
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {

        val tvShow: TvTitlesViewModel = TITLE_LIST[position]
        holder.titleShow.text = tvShow.title
        holder.description.text = tvShow.description
        holder.showImage.setImageResource(tvShow.title_image)
        holder.tvTitleExpand.setOnClickListener {
            holder.description.visibility = View.VISIBLE
            holder.showImage.visibility = View.VISIBLE
            holder.tvTitleButton.visibility = View.VISIBLE

        }
        holder.tvTitleButton.setOnClickListener {
            when(position){
                0->{
                    // احتاج ان ارسل العنوان الى الفراقمنت الاخرى اذا امكن ذلك
                }
            }
        }
    }
    class ViewHolder(Itemview : View): RecyclerView.ViewHolder(Itemview){

        val titleShow = itemView.findViewById<TextView>(R.id.tvTitle)
        val description = itemView.findViewById<TextView>(R.id.tvDesription)
        val showImage = itemView.findViewById<ImageView>(R.id.tvImage)
        var tvTitleExpand = itemView.findViewById<CardView>(R.id.tvTitleExpand)
        val tvTitleButton = itemView.findViewById<Button>(R.id.tvTitleButton) // this is a button inside a recycler view
    }
}

My fragment

class TvTitlesFragment : Fragment() {

val TV_TITLE : ArrayList<TvTitlesViewModel> = ArrayList()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_tv_titles, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    val adapter = tvTitleAdapter(context!!,TV_TITLE)
    tvTitles.layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
    tvTitles.setHasFixedSize(true)
    tvTitles.adapter = adapter
    tvShowTitles()
}
private fun tvShowTitles(){
    TV_TITLE.add(TvTitlesViewModel(R.drawable.abdelbasset_abdessamad, "برنامج على مائدة الأفطار", "برنامج على مائدة الافطار من تقديم الشيخ علي الطنطاوي رحمه الله, تم بث أول حلقة منه في عام 1960 م واستمر الى عام1992 م"))
    TV_TITLE.add(TvTitlesViewModel(R.drawable.abdelbasset_abdessamad, "برنامج على مائدة الأفطار", "برنامج على مائدة الافطار من تقديم الشيخ علي الطنطاوي رحمه الله, تم بث أول حلقة منه في عام 1960 م واستمر الى عام1992 م"))
    TV_TITLE.add(TvTitlesViewModel(R.drawable.abdelbasset_abdessamad, "برنامج على مائدة الأفطار", "برنامج على مائدة الافطار من تقديم الشيخ علي الطنطاوي رحمه الله, تم بث أول حلقة منه في عام 1960 م واستمر الى عام1992 م"))
    TV_TITLE.add(TvTitlesViewModel(R.drawable.abdelbasset_abdessamad, "برنامج على مائدة الأفطار", "برنامج على مائدة الافطار من تقديم الشيخ علي الطنطاوي رحمه الله, تم بث أول حلقة منه في عام 1960 م واستمر الى عام1992 م"))
    TV_TITLE.add(TvTitlesViewModel(R.drawable.abdelbasset_abdessamad, "برنامج على مائدة الأفطار", "برنامج على مائدة الافطار من تقديم الشيخ علي الطنطاوي رحمه الله, تم بث أول حلقة منه في عام 1960 م واستمر الى عام1992 م"))
    TV_TITLE.add(TvTitlesViewModel(R.drawable.abdelbasset_abdessamad, "برنامج على مائدة الأفطار", "برنامج على مائدة الافطار من تقديم الشيخ علي الطنطاوي رحمه الله, تم بث أول حلقة منه في عام 1960 م واستمر الى عام1992 م"))

}

 

هذه صور لتطبيقي

 اريد ان اضغط الزر وارسل عنوان البرنامج الى الصورة الفراقمنت بالصورة الثانية( الي فيها زر youtube)

InkedWhatsApp Image 2021-08-29 at 8.07.14 PM_LI.jpg

WhatsApp Image 2021-08-29 at 8.07.17 PM.jpeg

تم التعديل في بواسطة عبدالرحمن العنزي4
تعديل بعض الاملاء
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

@عبدالرحمن العنزي4

يوجد عدة طرق لقيام بذلك لكن بما أن البيانات تريد إرسالها من Recycler View إلى Fragment فيجب أن نقوم أولاً بعمل interface مع القيم التي نريد تمريرها لربط ال adapter مع الfragment الذي يحوي الRecycler View الأن كيف نقوم بذلك أولاً نقوم بعمل ملف ال interface مع البيانات التي نريد تمريرها في حالتنا هي الposition و title 

public interface FragmentCommunication { 
  void respond(int position,String title); 
}

والأن في ملف ال Recycler view adapter نقوم بعمل object من ال interface أعلاه هكذا بعد القوس { في بداية الكلاس أي بعد هذا الجزء

class tvTitleAdapter (val context: Context,val TITLE_LIST : ArrayList<TvTitlesViewModel>) : RecyclerView.Adapter<tvTitleAdapter.ViewHolder>() {
private FragmentCommunication Communicator;

ثم أيضاً نقوم بعمل object من ال layoutinflater 

private LayoutInflater inflater;

ثم نقوم بعمل object من المودل الخاصة بك 

private List<TvTitlesViewModel> dList;

بعدها نقوم بعمل constructer للبيانات أعلاه 

public tvTitleAdapter (Context context, List<TvTitlesViewModel> clist,FragmentCommunication communication) { 
  inflater = LayoutInflater.from(context); 
  dList= clist; Communicator=communication; 
}

والأن في الميثود onCreateViewHolder 

قم بإضافة الview holder وإرجاعه ك view رئيسي هكذا بعد السطر 

val view = LayoutInflater.from(parent.context).inflate(R.layout.tv_titles_design, parent, false)
ViewHolder holder = new ViewHolder(view,mCommunicator);

ثم نقوم بإرجاعه بدل

return ViewHolder(view)

هكذا

return holder;

والأن نقوم بإستخدام Bundle لتمرير البيانات التي نريدها أولاً في ال onclicklistener نقوم بتمرير ال title بهذا الشكل إستبدل Fragment2 بإسم الfragment الأخر 

Fragment2 fragment2=new Fragment2(); 
Bundle bundle=new Bundle(); 
bundle.putString("TITLE",tvShow.title);  
fragment2.setArguments(bundle);

أخيراً في الكلاس ViewHolder 

class ViewHolder(Itemview : View): RecyclerView.ViewHolder(Itemview){

قم بعمل object من ال interface التي قمنا بعملها في البداية 

FragmentCommunication Comminication;

ثم قم بإضافة الFragmentCommunication إلى الكلاس بجانب Itemview أي هكذا 

class ViewHolder(Itemview : View,FragmentCommunication : Communicator): RecyclerView.ViewHolder(Itemview){

ثم نقوم بعمل constructor ونسند له الobjects يلي عملنها فوق بهذا الشكل

ViewHolder(itemView : View,Communicator :FragmentCommunication ) { 
  super(itemView); 

 val titleShow = itemView.findViewById<TextView>(R.id.tvTitle)

 Comminication=Communicator;

titleShow.setOnClickListener(this); 
} 

ثم 

@Override public void onClick(View view) { 
  Comminication.respond(getAdapterPosition(),dList.get(getAdapterPosition()).name); 
    }

ثم في الFragment الذي يحوي ال Recycler view أضف مع إستبدال Fragment2  بإسم الfragment الثاني الذي ستشارك معه البيانات

FragmentCommunication communication=new FragmentCommunication() { 
  @Override
    public void respond(int position,String title) {
    Fragment2 fragment2=new Fragment2(); 
    Bundle bundle=new Bundle(); 
    bundle.putString("TITLE",title);  
    fragment2.setArguments(bundle); 
    FragmentManager manager=getFragmentManager(); 
    FragmentTransaction transaction=manager.beginTransaction(); 
    transaction.replace(R.id.dumper,fragment2).commit(); 

	} 
};

أخيراً في الFragment الثاني الذي شاركنا معه البيانات قم بتعريف متغير سيحمل الtitle في بداية الكلاس الرئيسي

String title;

ثم في ال oncreate ميثود بعد super.onCreate نقوم بإرجاع الtitle هكذا

title=getArguments().getString("TITLE");

ثم في ال onCreateView ميثود نقوم بوضع ال title الذي قمنا بإرجاعه فوق في ال textView 

إستبدل 

return inflater.inflate(R.layout.fragment_tv_titles, container, false)

ب

View view =  inflater.inflate(R.layout.fragment_tv_titles, container, false)

val titleShow = itemView.findViewById<TextView>(R.id.tvTitle)

titleShow.setText(title);

return view;

بعد ذلك سيتم إرسال البيانات وعرضها في الfragment الأخر , في حال واجهت مشكلة في ذلك أرفق لي ملف التطبيق بشكل كامل حتى أستطيع المساعدة بشكل أكبر 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...