迭代 RecyclerView 中的所有项目

Jam*_*mes 5 android for-loop android-studio android-recyclerview

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

我觉得最好的方法是 for 循环,但我似乎无法找到 for 循环应该是什么。我也尝试重置所有 CardViews,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));
    }
});
Run Code Online (Sandbox Code Playgroud)

这是我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);
}
Run Code Online (Sandbox Code Playgroud)

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

Ben*_* P. 6

通常,您应该以这样一种方式编写您的适配器,onBindViewHolder()即您可以修改视图的唯一位置。对于您想要做的事情,我认为最简单的方法是跟踪最后点击的位置,然后onBindViewHolder()根据其位置是否等于最后点击的位置将背景设置为黑色或白色。

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

    ...
}    
Run Code Online (Sandbox Code Playgroud)

您可以通过仅通知适配器旧的点击位置和新的点击位置已更改(这样您就不必重新绑定每个视图)来改进这一点,但为了简单起见,我保持原样.


小智 6

for (int x = recyclerView.getChildCount(), i = 0; i < x; ++i) {
  ViewHolder holder = recyclerView.getChildViewHolder(recyclerView.getChildAt(i));
}
Run Code Online (Sandbox Code Playgroud)