Soru Bağdaştırıcıdan ana RecyclerView öğesine başvuruda bulunmanın daha iyi bir yolu var mı?


Ebeveyn için referansa ihtiyacım olan bir kullanım vakam var RecyclerView adaptörün içinden, özellikle onBindViewHolder yöntem. Şimdiye kadar yaptığım şey, onu özel bir sınıfa üye olarak atamaktır. onCreateViewHolder boyunca geçen yöntem viewGroup parent arg böyle:

private ViewGroup mParent;

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // inflater logic.
    mParent = parent;
}

Ve ebeveyne referans vermek RecyclerView içinde onBindViewHolder bunun gibi:

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    // binder logic.
    ((RecyclerView)mParent).blahBlahBlah();
}

Bunu yapmanın daha iyi bir yolu var mı? Olabilir RecyclerView.Adapter özlemiş olabileceğim bir yolu var mı?


44
2017-07-06 14:30


Menşei




Cevaplar:


Aslında, bağdaştırıcıya eklenmiş RecyclerView ile geri dönen belirli bir yöntem var. Sadece onAttachedToRecylerView () yöntemini geçersiz kıl.

public class Adapter_RV extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

    RecyclerView mRecyclerView; 


    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);

        mRecyclerView = recyclerView;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        mRecyclerView....
    }

117
2017-07-06 15:50



Bunu belgelerde nasıl özledim! Teşekkür ederim, bu tam olarak aradığım şey! - nabir
Belgeler şöyle diyor: "Aynı adaptörün birden çok RecyclerViews tarafından gözlemlenebileceğini unutmayın." developer.android.com/reference/android/support/v7/widget/...  Yanlışım varsa düzeltin, ancak adaptörü birden fazla RecyclerView'a atarsanız sorun yaratmaz mı? - UnTraDe
@UnTraDe evet olurdu. Yukarıdaki kod, önceki RecyclerView örneğinin üzerine yazacaktır. Bir çözüm, bağlı RecyclerView örneklerinin bir listesini tutmak ve onDetachedFromRecyclerView (..) içindeki örnekleri kaldırmak olacaktır. Mümkünse, bunu önlemek ve her bir RecyclerView örneği için bir bağdaştırıcı örneği oluşturmak en iyisi olacaktır. - masterwok


Muhtemelen viewHolder içinde bir arayüz oluşturmak ve ebeveyne geçmek ve orada uygulamak istersiniz.


1
2017-07-06 14:39





Başka bir yol, kurucuda bir referansı, örn.

public final class MyAdapter extends RecyclerView.Adapper {
    private final recyclerView;

    public MyAdapter(@NonNull RecyclerView recyclerView) {
        this.recyclerView = recyclerView;
    }

    ...

    @Override
     public void onBindViewHolder(ViewHolder holder, int position) {
        ...
    }
}

1
2017-07-06 14:51