Design Issue - RecyclerView va Fragments o'rtasidagi muloqot qilish

Mening bitta faoliyatim va ikkita qismim, Fragment A va Fragment B bor. Fragment Ada bir RecyclerView mavjud. Uning adapterida (MovieRecyclerAdapter) menda Fragment A ga qayta bosilgan ustunning identifikatorini o'tkazadigan Interfeys bor.

Adapterda interfeys:

private MovieClickedListener movieClickedListener;

public interface MovieClickedListener{
    void onCLicked(int Id);
}

public MovieRecyclerAdapter(MovieClickedListener listener){
    this.movieClickedListener = listener;
}

Ma'lumotni olish uchun buni Fragmentlar sinfida amalga oshira olaman.

implements MovieRecyclerAdapter.MovieClickedListener

Hozirda ma'lumotlarim bor. Mana mening muammom, uni B paragrafiga kiritishim kerak. Men Fraktsiya A va mening faoliyatim o'rtasidagi aloqani amalga oshiradigan va u erda ishlashim kerak bo'lgan ANIQ interfeysni amalga oshirishim mumkinligini bilaman, keyin mening faoliyatim uni qaytarib olib, identifikatorni B paragrafiga o'tkazadi.

Men to'g'ri strategiyammi yoki Chiqish idini Fragment A da RecyclerView dan Fragment B ga olishning yanada samaraliroq usuli bormi?

Interfeysni "RecyclerView" dan "FragmentA" o'rniga to'g'ridan-to'g'ri faoliyatimga kiritishga harakat qildim, lekin hozir men biror elementni chertganimda hech narsa bo'lmaydi.

Bu oddiy jurnali bayoni bilan Activity'da tıklananListener.

public class MainActivity extends AppCompatActivity implements MovieRecyclerAdapter.MovieClickedListener {   @Override
public void onCLicked(int Id) {
    Log.v("TAG","In MainActivity")
}}

Muammoni hal qilsam, mening qismimdagi "RecyclerView" ni kashf qilsam, "bu" parametrini adapter uchun konstruktiv parametr sifatida qabul qila olmayman.

movieRecyclerAdapter = new MovieRecyclerAdapter(this);

Men barcha kontekstlarni sinab ko'rdim va u ishlamaydi

1
Uni yuqorida yangiladim
qo'shib qo'ydi muallif Mark F, manba
Uni yuqorida yangiladim
qo'shib qo'ydi muallif Mark F, manba
Faoliyat ichida bosish interfeysini joriy qilgan kodni joylashtiring
qo'shib qo'ydi muallif Nika Kurdadze, manba

7 javoblar

Savolingizning oxirgi qismiga:

Faoliyatingizdagi interfeysni amalga oshirishni istasangiz, ushbu kodni o'zingizning qismingizda qo'shishingiz mumkin:

@Override
public void onAttach(Context context) {
  super.onAttach(context);

  if (context instanceof MovieRecyclerAdapter.MovieClickedListener){
   //save the interface in a field 
    callback = (MovieRecyclerAdapter.MovieClickedListener) context;
  }
}

Keyinchalik siz bunday adapterni ishga tushirishingiz mumkin:

movieRecyclerAdapter = new MovieRecyclerAdapter(callback);

Endi nimani tavsiya qilaman:

Agar men sizni tortib olsam, siz qayta ishlash ma'lumotlarining bir qismini bosib, boshqa qismga o'tishni istaysiz. Mening ilovamda shunga o'xshash muammom bor va buni shunday hal qildim:

Menda narsalar kino obyekti bo'lgan joyda qayta ishlanadigan ma'lumotlar bor. Men har doim kino identifikatorlari bilan ishlayman. Haqiqiy kino ob'yektlari singleton menejerlari sinfi tomonidan boshqarildi. Shunday qilib men ob'ektni bosgan holda yangi Niyat yarataman va kino identifikatorini yangi tadbirga o'tkazaman. Agar men kino obyektiga kirishni xohlasam, manager.getInstance (). GetMovie (movieid); kabi narsalarni qidirish kerak. Shunday qilib, haqiqiy ob'ektga kirish uchun o'tgan filmni ishlataman.

2
qo'shib qo'ydi
Qaytib kelgan o'zgaruvchining onAttach() usulida nima ekanligiga shubha bilan qarayman
qo'shib qo'ydi muallif Mark F, manba
Ushbu o'zgaruvchan siz MainActivity-ga kiritilgan interfeysdir. Istaganingizday qo'ng'iroq qilishingiz mumkin. Masalan, movieclicklistener. Men uni qayta chaqirgan edim, chunki u "avval" sinfda amalga oshirgan vazifani amalga oshiradi, shuning uchun funktsiyani amalga oshiradigan sinfga "qo'ng'iroq" "orqaga" buring.
qo'shib qo'ydi muallif beeb, manba

Savolingizning oxirgi qismiga:

Faoliyatingizdagi interfeysni amalga oshirishni istasangiz, ushbu kodni o'zingizning qismingizda qo'shishingiz mumkin:

@Override
public void onAttach(Context context) {
  super.onAttach(context);

  if (context instanceof MovieRecyclerAdapter.MovieClickedListener){
   //save the interface in a field 
    callback = (MovieRecyclerAdapter.MovieClickedListener) context;
  }
}

Keyinchalik siz bunday adapterni ishga tushirishingiz mumkin:

movieRecyclerAdapter = new MovieRecyclerAdapter(callback);

Endi nimani tavsiya qilaman:

Agar men sizni tortib olsam, siz qayta ishlash ma'lumotlarining bir qismini bosib, boshqa qismga o'tishni istaysiz. Mening ilovamda shunga o'xshash muammom bor va buni shunday hal qildim:

Menda narsalar kino obyekti bo'lgan joyda qayta ishlanadigan ma'lumotlar bor. Men har doim kino identifikatorlari bilan ishlayman. Haqiqiy kino ob'yektlari singleton menejerlari sinfi tomonidan boshqarildi. Shunday qilib men ob'ektni bosgan holda yangi Niyat yarataman va kino identifikatorini yangi tadbirga o'tkazaman. Agar men kino obyektiga kirishni xohlasam, manager.getInstance (). GetMovie (movieid); kabi narsalarni qidirish kerak. Shunday qilib, haqiqiy ob'ektga kirish uchun o'tgan filmni ishlataman.

2
qo'shib qo'ydi
Qaytib kelgan o'zgaruvchining onAttach() usulida nima ekanligiga shubha bilan qarayman
qo'shib qo'ydi muallif Mark F, manba
Ushbu o'zgaruvchan siz MainActivity-ga kiritilgan interfeysdir. Istaganingizday qo'ng'iroq qilishingiz mumkin. Masalan, movieclicklistener. Men uni qayta chaqirgan edim, chunki u "avval" sinfda amalga oshirgan vazifani amalga oshiradi, shuning uchun funktsiyani amalga oshiradigan sinfga "qo'ng'iroq" "orqaga" buring.
qo'shib qo'ydi muallif beeb, manba

Faoliyat chaqiruvini parametr sifatida quyidagi tarzda olib o'tishingiz mumkin:

movieRecyclerAdapter = new MovieRecyclerAdapter((MovieRecyclerAdapter.MovieClickedListener) getActivity());
1
qo'shib qo'ydi

Bundle ichida fragmentlar yoki faollik bilan tinglovchini o'tkazdingizmi? Ha bo'lsa, qabul qiluvchining tarafida tinglovchining yana bir nusxasini yaratadi.

Now in your case, you need to check about observable and observer. https://stackoverflow.com/a/40627973/3728591

0
qo'shib qo'ydi

Bundle ichida fragmentlar yoki faollik bilan tinglovchini o'tkazdingizmi? Ha bo'lsa, qabul qiluvchining tarafida tinglovchining yana bir nusxasini yaratadi.

Now in your case, you need to check about observable and observer. https://stackoverflow.com/a/40627973/3728591

0
qo'shib qo'ydi

FragmentB MovieClickedListener dasturini taqdim etsin

Faoliyatingiz ikkala fragment uchun fragA va fragB deb nomlangan

Faoliyat sifatida chaqiramiz

fragA.setMovieClickedListener(fragB);

FragmentA usulini qo'shish

public void setMovieClickedListener(MovieClickedListener listener){
 adapter.setMovieClickedListener(listner);
}

Endi sizning adapteringiz FragmentB uchun tinglovchiga ega

Eslatma: adapter birinchi qismda A shaklida yaratilishi kerak

0
qo'shib qo'ydi

FragmentB MovieClickedListener dasturini taqdim etsin

Faoliyatingiz ikkala fragment uchun fragA va fragB deb nomlangan

Faoliyat sifatida chaqiramiz

fragA.setMovieClickedListener(fragB);

FragmentA usulini qo'shish

public void setMovieClickedListener(MovieClickedListener listener){
 adapter.setMovieClickedListener(listner);
}

Endi sizning adapteringiz FragmentB uchun tinglovchiga ega

Eslatma: adapter birinchi qismda A shaklida yaratilishi kerak

0
qo'shib qo'ydi