更改RecyclerView所有项的视图可见性

3

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

但是当item1正在播放录音时,如果用户点击item2,则item1所在行的按钮会回到其原始位置。

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

我还尝试在inBindViewHolder方法中控制视图,但无法实现,因为每当我单击holder对象时,只会控制当前选择的行的视图。

以下代码片段放置在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);  

                        }
                     }
                 }
});

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

下面的代码添加在onBindViewHolder中

holder.mPlayAudio.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { // 此部分包含播放和停止音频的代码。 // 使用以下语句,我只能更改当前选定行视图的可见性,而不能更改其他行视图的可见性 holder.mPlayAudio.setImageResource(R.drawable.play); } }


如果您想隐藏每个条目的可见性,那么可以在适配器中设置一个变量。因此,当您点击一个项目时,它将将布尔值hideItems设置为true。最后,在您的BindViewHolder中使用if语句检查hideItems是否为true,以及隐藏可见性。无法记住是否还需要刷新数据集。 - C. Skjerdal
不,我不想隐藏RecyclerView中的每个单独项。实际上,我在RecyclerView的每一行中都有一个播放按钮。每当点击此按钮时,按钮的可见性会更改,就像此图像https://imgur.com/0fpk0Jv所示。 - Ehtasham Ali
当用户单击第一行按钮时,可见性会发生变化,这很正常。但是,当用户单击RecyclerView的第二行按钮时,我希望将第一行按钮更改为回到其原始位置。场景如图所示imgur.com/n4Q26Qm。 - Ehtasham Ali
抱歉回复晚了,如果有机会的话,我会写出完整的答案。最好的选择可能是,如果您传入一个自定义数据类型的List或ArrayList,则可以添加一个布尔变量“isVisibile”。这样,您可以遍历此列表中的所有详细信息,然后将当前设置为“False”。这是我的第一个想法,但如果没有其他人回答,明天我会发布答案。 - C. Skjerdal
1个回答

6

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

答案 在BindViewHolder中,当您进行项单击后,请保存该项位置的值。然后在单击事件内调用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();
}


}

这是我的一个项目,当我选择一个项目时,它会将背景资源更改为选定状态,然后其余的项目会返回到默认状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接