更改 RecyclerView 的所有项的 View 可见性

Eht*_*Ali 2 java android android-recyclerview

我有一个 RecyclerView,它在单击某些项目时播放录音。我希望当用户单击正在播放特定录音的 item1 并且更改按钮 View 时的行为,这可以正常工作。

但同时当 item1 录音正在播放并且用户点击 item2 然后 item1 行按钮回到其原始位置。

下图显示了单击 item1(第 1 行)时的视图。(这工作正常)

我还测试了这个以控制 inBindViewHolder 方法中的视图。但是它不起作用,因为每当我单击持有者对象时,它只控制当前选定行的视图。

下面的代码部分放置在 ViewHolder 中

mPlayAudio.setOnClickListener(new View.OnClickListener() 
{
                @Override
                public void onClick(View view) 
                {
                    Log.d(TAG, "onClick: Present in onClick mPlayAudio");
                    if (listener != null) 
                    {
                        final int position = getAdapterPosition();
                        if (position != RecyclerView.NO_POSITION) 
                        {
                           // This section contain the code to play and stop 
                              the audio

                          // Using below line I only able to change selected 
                          // row button View not other row Button View  
                          mPlayAudio.setImageResource(R.drawable.play);  

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

我也在 onBindViewHolder 方法中尝试过这个,但仍然无法正常工作。

下面的代码添加到 onBindViewHolder

holder.mPlayAudio.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { // This section contain code to play and stop audio //Using below statement I only able to change the //visibility of current selected row View not others holder.mPlayAudio.setImageResource(R.drawable.play); } }

C. *_*dal 5

所以我终于能够在我自己的项目中尝试这个。

回答 在 BindViewHolder 中,单击某个项目后,保存该项目的位置值。然后在 click 事件中调用 notifyDataSetChanged ,这将刷新适配器。现在它获得了你的结果,在 BindViewHolder 中有一个 if 语句检查是否应该相应地设置该值(或不可见),否则显示为可见。

示例代码

public class SelectorAdapter extends RecyclerView.Adapter<SelectorAdapter.ItemHolder> implements View.OnClickListener {

private List itemList;
private int selectedKey;

public SelectorAdapter(List list) {
    itemList = list;
}

@Override
public void onClick(View v) {

}


/* ViewHolder for each item */
class ItemHolder extends RecyclerView.ViewHolder {

    //title
    @BindView(R.id.selector_title)
    TextView title;

    @BindView(R.id.selector_layout)
    LinearLayout selector;

    ItemHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);

    }
}


@Override
public ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item_layout_selector, parent, false);

    return new ItemHolder(itemView);
}


@Override
public void onBindViewHolder(ItemHolder holder, int position) {

    String title = (String) itemList.get(position);

    holder.title.setText(title);

    if (position != selectedKey) {
        holder.title.setBackgroundResource(R.drawable.selector);
    } else {
        holder.title.setBackgroundResource(R.drawable.selector_selected);
    }


    holder.itemView.setOnClickListener(v -> {
        Timber.e("selected item: %s", position);
        selectedKey = position;
        notifyDataSetChanged();
    });

}


@Override
public int getItemCount() {
    Timber.e("itemCount: %s", itemList.size());
    return itemList.size();
}


}
Run Code Online (Sandbox Code Playgroud)

这是我自己的项目,当我选择一个项目时,它会将后台资源更改为已选中,然后其余部分返回到默认状态。