2017-12-12 6 views
0

私のRecyclerViewAdapter; RecyclerViewのリスト項目のレイアウトに変更が加えられた場合、それはしばらくの間繰り返されます。 RecyclerViewAdapterの内部クラスViewHolderでは、mainLayoutというレイアウトのonClickListenerをリスト項目に設定しました。これをクリックすると、同じリスト項目の別のレイアウトexpandableLayoutが展開されます。クリックすると、希望するアイテムが展開されるだけでなく、の11アイテムに1アイテムずつのアイテムが展開されます。テキストの色を変更するなどの単純なレイアウトの変更にも同じです。私はしばらくの間、この問題に引っかかってい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で呼び出されるとは限りません。たとえば、スクロールダウンすると、画面を一番上に残すビューが最後に追加されます。

ViewHolderのすべてのレイアウトプロパティをonBindに設定してください(レイアウトが展開されているかどうかなど)。あなたのlogListの各項目にブール値isExpandedがあり、それに応じて展開状態を設定することができます。onBind

+0

答えをありがとう、魅力のように動作します。私はそれをそういう考え方ではなかったことに驚いています。 –

関連する問題