1

편집 :익명 리스너 RecyclerView에서 어댑터

나는 큰 데이터 세트에 대한 성능 문제 여부를 야기 bindViewHolder 방법 익명 리스너를 만드는 방법에 대해 알고 싶습니다.

내가 RecyclerView 어댑터를 가지고 있다고 가정합니다. 그리고 bindViewHolder 메서드에서 모든 청취자를 설정하면 익명으로 모든 성능 문제가 발생합니까? 사용자가 RecyclerView를 스크롤하면 Anonymous 리스너가 많이 생성되어 뷰에 설정되기 때문입니다.

예 :

view.setOnClickListener(new View.OnClickListener() 
{ 
    @Override 
    public void onClick(View v) 
    { 
    } 
}); 

또는 난 내 ViewHolder 클래스에서 OnClickListener를 구현 그냥 익명의 청취자의

다음
view.setOnClickListener(this); 

많은이 만들어지지 않습니다 views.Like에 추가 할 수 있습니다. 대형 데이터 세트의 성능 계산에서 이전의 성능이 더 우수합니까?

미리 감사드립니다.

+0

viewholder create listener 내부에서 이것을 시도 할 수 있으며 성능을 더 좋게 만들 수있는 this.setIsRecyclable (false) 속성이 하나 있습니다. https://stackoverflow.com/questions/46095866/getting-android-recyclerview-to -update-view-inside-react-native-component/46313257 # 46313257 –

답변

0

기본적으로 RecyclerView의 모든 항목에 OnClickListener을 설정하고 Activity 또는 Fragment에 '연결'합니다. 이 "연결"은 중요하므로 Activity 또는 Fragment 안에 onItemClick 메서드를 포함하고 거기에있는 멤버에 액세스 할 수 있습니다.

최소한의 구현 (A Fragment에,하지만 당신은 또한 Activity을 사용할 수 있습니다)과 같을 것이다 :

public class YourFragment extends Fragment implements RecyclerViewAdapter.ItemClickListener { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 

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

     RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recyclerview); 
     RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(activity); 
     recyclerViewAdapter.setClickListener(this); 
     recyclerView.setAdapter(recyclerViewAdapter); 

     return view; 
    } 

    @Override 
    public void onItemClick(View view, int position) { 
     // do something here 
    } 
} 

그리고

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> { 
    private ItemClickListener itemClickListener; 

    void setClickListener(ItemClickListener itemClickListener) { 
     this.itemClickListener = itemClickListener; 
    } 

    interface ItemClickListener { 
    void onItemClick(View view, int position); 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     // TextView is an example 
     final TextView textView; 

     ViewHolder(View itemView) { 
      super(itemView); 
      textView = (TextView) itemView.findViewById(R.id.text); 
      textView.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View view) { 
      if (itemClickListener != null) { 
       itemClickListener.onItemClick(view, getAdapterPosition()); 
      } 
     } 
    } 
} 
+0

여기 해결책을 묻는 중입니다. 단지 성능 문제가 발생했는지 알고 싶습니다. 어쨌든 감사합니다. –

1

RecyclerView는 몇 가지 항목이 표시됩니다 Adapter 클래스, ViewHolder은 표시되는 항목에 대해서만 작성되므로 어댑터에 1000s의 항목이 있어도 ViewHolders의 작은 부분 만 작성됩니다.

addListener 방법을 사용하면 대부분 setListener 메쏘드로 조심해야합니다. 리스너를 참조 만 유지하기 때문에 몇 밀리 초 밖에 걸리지 않고 동일한 리스너를 반복해서 설정할 것입니다 이행.

그러나 addListener으로 새 수신기를 추가하기 전에 기존 수신기를 제거해야합니다. addListeneraddTextWatcher

//.. part of adapter 

private TextWatcher textWatcher; 

public void bindViewHolder(DataViewHolder holder, int index){ 

    // no performance issue 
    holder.button.setClickListener(....); 

    // wrong, this is added everytime 
    holder.editText.addTextWatcher(....); 


    // this is safe... 
    if(textWatcher != null) 
     holder.editText.removeTextWatcher(textWatcher); 

    textWatcher = new TextWatcher(){ 
     // ... implementation 
    }; 
    holder.editText.addTextWatcher(textWatcher); 
} 
+1

답변 해 주셔서 감사합니다. 실제로 나는 청취자를 익명으로 설정하는데 집중했다. (나는 그 질문을 편집했다. 미안.) bindviewHolder 메소드에서 익명의 리스너를 설정할 때마다 나는 새로운 익명 클래스를 생성 할 것이다. 그래서 많은 익명 클래스가 생성 될 것이다. 스크롤 할 때. 내가 틀렸다면 나를 바로 잡아라. 감사 –

0

인의 setListener

예 내가 컴파일러 그냥 후드 익명 클래스의 이름없는 콘크리트 버전을 생성 확신 setClickListener 예이다. 이는 인터페이스를 구현하고 콘크리트 수신기로 this을 제공하는 것과 거의 동일합니다. 현실적으로, 당신은 어느 쪽이든에 성과 문제가 있으면 안된다.

익명 클래스가 외부 클래스에 대한 참조를 보유한다는 사실을 명심하십시오. 메모리 누수가 생길 수 있습니다 (예 : 외부 클래스가 활동 인 경우). 또는 시간이 지남에 따라 작은 조각 대신 가비지 수집이 한꺼번에 이루어 지도록 만들 수 있습니다. 자세한 내용은 오라클 설명서의 Implicit and Synthetic Parameters을 참조하십시오.