어댑터에서 부모 RecyclerView에 대한 참조를 얻는 더 좋은 방법이 있습니까?


81

RecyclerView어댑터 내부, 특히 onBindViewHolder메서드 내부에서 부모에 대한 참조가 필요한 사용 사례가 있습니다. 지금까지 내가하는 일은 다음 onCreateViewHolder과 같이 viewGroup parentarg를 전달 하는 메서드 의 private 클래스 멤버에 할당하는 것입니다 .

private ViewGroup mParent;

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

그리고 다음과 같이 부모 RecyclerView를 참조하십시오 onBindViewHolder.

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

이 작업을 수행하는 더 좋은 방법이 있습니까? 어쩌면 RecyclerView.Adapter내가 놓친 수있는 방법이있다?

답변:


221

실제로 RecyclerView어댑터에 연결된로 콜백하는 특정 메서드가 있습니다. onAttachedToRecylerView(RecyclerView recyclerView)메서드를 재정의하십시오 .

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....
    }

1
문서에서 이것을 어떻게 놓쳤습니까! 감사합니다. 이것이 바로 제가 찾던 것입니다!
nabir

5
문서에는 "여러 RecyclerView에서 동일한 어댑터가 관찰 될 수 있음을 명심하십시오." developer.android.com/reference/android/support/v7/widget/… 내가 틀렸다면 정정 해 주지만 둘 이상의 RecyclerView에 어댑터를 할당하면 문제가 발생하지 않습니까?
UnTraDe

3
@UnTraDe 그렇습니다. 위의 코드는 이전 RecyclerView 인스턴스를 덮어 씁니다. 해결책은 연결된 RecyclerView 인스턴스 목록을 유지하고 onDetachedFromRecyclerView (..)에서 인스턴스를 제거하는 것입니다. 가능하면이를 피하고 각 RecyclerView 인스턴스에 대한 어댑터 인스턴스를 만드는 것이 가장 좋습니다.
masterwok

좋아요 200 번째 가치!
iuq

3

또 다른 방법은 생성자에서 참조를 전달하는 것입니다.

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) {
        ...
    }
}

난 당신이 일반적으로, 컨텍스트를 통과 항목의 목록, recommect하지 않는 상황이 너무 재활용보기를 통과 버지 얻을
아메드 Rajab
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.