代码之家  ›  专栏  ›  技术社区  ›  James

迭代RecyclerView中的所有项

  •  0
  • James  · 技术社区  · 8 年前

    我有一份卡片回收服务。我试图让它在你点击其中一个卡片视图和它改变背景的卡片视图。这部分有效。我被困的地方是试图将所有其他的卡片视图改回白色,这样看起来就不会选择多个。

    我觉得最好的方法是for循环,但我似乎找不到for循环应该是什么。我还试着用 notifyDataSetChanged() 但这也不管用。

    这是我的 onItemClicked() 功能(正常工作):

    mAdapter = new TransferCard(list, getContext(), new TransferCard.OnItemClickListener() {
        @Override 
        public void onItemClick(View v, int position) {
            //What code goes here to change all Views in the RecyclerView to have a background of white
            RelativeLayout temp = v.findViewById(R.id.cardForeground);
            item = list.get(position);
            temp.setBackgroundColor(getResources().getColor(R.color.selected));
        }
    });
    

    这是我的 onCreateViewHolder() 其中 setOnTouchListener() 事件是。

    @Override
    public MyViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.transfer_card, parent, false);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onItemClick(v, parent.indexOfChild(v));
            }
        });
        return new MyViewHolder(itemView);
    }
    

    似乎我就在那里,但我需要知道如何处理for循环。

    3 回复  |  直到 8 年前
        1
  •  4
  •   Ben P.    8 年前

    一般来说,您应该以这样的方式编写适配器 onBindViewHolder() 是唯一可以修改视图的地方。对于你要做的,我认为最简单的事情就是跟踪最后一个被攻破的位置,然后 onBindViewHolder() 根据背景的位置是否等于最后点击的位置,将背景设置为黑色或白色。

    @Override 
    public void onItemClick(View v, int position) {
        lastTappedPosition = position;
        mAdapter.notifyDataSetChanged();
    }
    
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        if (position == lastTappedPosition) {
            // set color selected
        } else {
            // set color unselected
        }
    
        ...
    }    
    

    您只需通知适配器旧的抽头位置和新的抽头位置已经更改(这样您就不必重新绑定每个视图),就可以对此进行改进,但为了简单起见,我保留了原来的状态。

        2
  •  2
  •   camille    8 年前
    for (int x = recyclerView.getChildCount(), i = 0; i < x; ++i) {
      ViewHolder holder = recyclerView.getChildViewHolder(recyclerView.getChildAt(i));
    }
    
        3
  •  0
  •   Nongthonbam Tonthoi    8 年前
    1. 你应该有一个像 isSelected 在您的模型中,将所有列表项都设为false。

    2. 把它传给你的适配器。

    3. 在适配器中检查条件 onBindViewHolder :

      if (list.get(i).isSelected) { // change background to black } else { // change background to white
      }

    4. 每当你点击一个项目的变化只是相反的字段项目,即使它为真,如果它是假的,或使它为假,如果它是真的。

      list.get(i),isSelected = !list.get(i).isSelected;

    推荐文章