2017-12-12 1 views
0

내 있음 RecyclerViewAdapter; RecyclerView의 목록 항목의 레이아웃을 변경하면 잠시 동안 반복됩니다. RecyclerViewAdapter의 내부 클래스 ViewHolder에서 목록 항목에 mainLayout이라는 레이아웃의 onClickListener을 설정합니다. 이것을 클릭하면 같은 목록 항목에 expandableLayout이라는 다른 레이아웃이 펼쳐집니다. 클릭하면 원하는 항목, 뿐만 아니라 모든 항목이 11 개 항목으로 확장됩니다 (). 텍스트 색상 변경과 같은 간단한 레이아웃 변경에도 동일하게 적용됩니다. 나는 잠시 동안이 문제에 끼 었어RecyclerView에서 반복되는 항목의 레이아웃 변경을 방지하려면 어떻게해야합니까?

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

    private Context mContext; 
    private ViewPager mViewPager; 
    private DataManager mDataManager; 

    public RecyclerViewAdapter(RecyclerView.LayoutManager layoutManager, Context context, ViewPager viewPager) { 
     this.mContext = context; 
     this.mViewPager = viewPager; 
     this.mDataManager = new DataManager(mContext, mViewPager); 
    } 

    class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
     FrameLayout mainLayout; 
     RelativeLayout editButton; 
     RelativeLayout deleteButton; 
     ExpandableLayout expandableLayout; 
     //Defined other View's of the item 

     ViewHolder(View listItemLayout) { 
      super(listItemLayout); 

      this.mainLayout = listItemLayout.findViewById(R.id.listItem_mainLayout); 
      this.editButton = listItemLayout.findViewById(R.id.expandedLogItem_edit); 
      this.deleteButton = listItemLayout.findViewById(R.id.expandedLogItem_delete); 
      this.expandableLayout = listItemLayout.findViewById(R.id.listItem_expandableLayout); 

      this.mainLayout.setOnClickListener(this); 
      this.editButton.setOnClickListener(this); 
      this.deleteButton.setOnClickListener(this); 

      //Initialized other View's of the item. 
     } 

     @Override 
     public void onClick(View view) { 
      if (view.getId() == mainLayout.getId()) { 
       expandableLayout.toggle(); 
       //This expands or collapses not just the clicked item, 
       //but every item once in 11 items. 
       //I tried other things like changing the text color 
       //of a TextView, and the result is the same. 
      } else if (view.getId() == editButton.getId()) { 
       mDataManager.editItemAt(getAdapterPosition()); 
      } else if (view.getId() == deleteButton.getId()) { 
       mDataManager.deleteItemAt(getAdapterPosition()); 
       notifyItemRemoved(getAdapterPosition()); 
      } 
     } 
    } 

    @Override 
    public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     final View listItemLayout = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_list_item, parent, false); 
     return new ViewHolder(listItemLayout); 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolder viewHolder, final int position) { 
     //Populating other View's of the item. 
    } 

    @Override 
    public int getItemCount() { 
     return logList.size(); 
    } 
} 

, 그리고 찾거나이 문제를 해결하기 위해 어떤 방법을 생각하지 못했습니다 :

다음은 RecyclerViewAdapter입니다. 모든 응답은 감사하겠습니다.

+0

왜 항목에서'View'에'onClickListener()'를 설정하지 않습니까? 배경 이미지가 있다고 가정하고,'holder.that_image_view.setOnClickListener() '와 같은 onBindViewHolder()에서 리스너를 설정한다고 가정 해 보겠습니다. –

+0

실제로 문제를 해결하기 위해 현재 이미지로 변경했습니다. 또한 일하지 않았다. –

+0

당신은 A. Kuckhinke의 대답으로, 나는 onBindViewHolder()에 청취자들을 옮겼다. 고마워. –

답변

0

이름에서 알 수 있듯이 RecyclerView는 화면 밖에서 ViewHolders를 재활용합니다. 따라서 onBind 메서드는 항상 새로 부풀려진 ViewHolder를 사용하여 호출되는 것이 아니라 이미 변경된 뷰홈 메서드를 사용하여 호출 할 수 있습니다. 예를 들어 아래로 스크롤 할 때 맨 위에 화면을 남긴 뷰가 맨 아래에 다시 추가됩니다.

ViewHolder의 모든 레이아웃 속성을 onBind으로 설정해야합니다 (예 : 레이아웃의 확장 여부). 당신은 logList의 각 항목에 부울 isExpanded을 가질 수 있고 그것에 따라 확장 상태를 설정할 수 있습니다. onBind

+0

답변 주셔서 감사합니다, 매력처럼 작동합니다. 나는 그렇게 생각하지 않았다는 것에 놀랐다. –

관련 문제