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

时间:2019-08-28 15:01:53

标签: java android android-recyclerview recycler-adapter

我有一个RecyclerView,当单击某些项目时,他会播放录音。我希望用户单击item1时正在播放特定的录音,并且更改了“视图”按钮,这可以正常工作。

但同时播放item1录音,并且用户单击item2,然后item1行Button返回到其原始位置。

下图显示了单击item1(行1)时的视图。 (这很好)

我也测试了此方法以控制inBindViewHolder方法中的视图。但是它不起作用,因为每当我单击Holder对象时,都仅控制当前选定行的视图。

下面的代码部分位于ViewHolder中

if (log.level == LogLevel.Info)
{
    var newloggger = (InfoLogDescriptor)log;
} 
else 
{
    var newloggger = (ErrorLogDescriptor)log;
}

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

在onBindViewHolder中添加的以下代码

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); } } } });

1 个答案:

答案 0 :(得分:0)

因此,我终于能够在自己的项目中进行尝试。

答案 单击项目后,在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();
}


}

这是我自己的项目,当我选择一个项目时,它将背景资源更改为“选定”,然后将其余资源恢复为默认状态。