迭代RecyclerView中的所有项目

问题描述 投票:0回答:4

我有一个 CardView 的 RecyclerView。我试图在您单击其中一个 CardView 的地方使用它,它会更改该 CardView 的背景。这部分有效。我陷入困境的是尝试将所有其他 CardView 更改回白色,这样看起来就不会选择多个。

我觉得最好的方法是使用 for 循环,但我似乎找不到 for 循环应该是什么。我还尝试使用

notifyDataSetChanged()
重置所有 CardView,但这也不起作用。

这是我的

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 循环。

android android-studio for-loop android-recyclerview
4个回答
9
投票
for (int x = recyclerView.getChildCount(), i = 0; i < x; ++i) {
  ViewHolder holder = recyclerView.getChildViewHolder(recyclerView.getChildAt(i));
}

Kotlin 解决方案:

myRecyclerView.children.forEach { childView ->
    val holder = myRecyclerView.getChildViewHolder(childView) as? MyViewHolder
}

6
投票

一般来说,您应该以这样的方式编写适配器:

onBindViewHolder()
是您修改视图的唯一地方。对于您想要做的事情,我认为最简单的方法是跟踪最后点击的位置,然后根据其位置是否等于最后一个位置将背景设置为黑色或白色点击位置。

onBindViewHolder()

@Override 
public void onItemClick(View v, int position) {
    lastTappedPosition = position;
    mAdapter.notifyDataSetChanged();
}
您可以通过仅通知适配器旧的点击位置和新的点击位置已更改来对此进行改进(这样您就不必重新绑定每个视图),但为了简单起见,我将其保留为-是。


1
投票
    您的模型中应该有一个类似
  1. @Override public void onBindViewHolder(ViewHolder holder, int position) { if (position == lastTappedPosition) { // set color selected } else { // set color unselected } ... }

    的字段,将所有列表项设置为 false。

    
    

  2. 将其传递给您的适配器。
  3. 在适配器中检查
  4. isSelected

    中的状况:

    
    

    onBindViewHolder

    
    

  5. 每当您单击某个项目更改时,只需反转字段项目,即如果为假则将其设为 true,如果为 true则将其设为 false。
  6. if (list.get(i).isSelected) { // change background to black } else { // change background to white
    }

    
    


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.