我有一个RecyclerView,当单击某些项目时,他会播放录音。我希望用户单击item1时正在播放特定的录音,并且更改了“视图”按钮,这可以正常工作。
但同时播放item1录音,并且用户单击item2,然后item1行Button返回到其原始位置。
下图显示了单击item1(行1)时的视图。 (这很好)
我也测试了此方法以控制inBindViewHolder方法中的视图。但是它不起作用,因为每当我单击Holder对象时,都仅控制当前选定行的视图。
if (log.level == LogLevel.Info)
{
var newloggger = (InfoLogDescriptor)log;
}
else
{
var newloggger = (ErrorLogDescriptor)log;
}
我也在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);
}
}
}
});
答案 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();
}
}
这是我自己的项目,当我选择一个项目时,它将背景资源更改为“选定”,然后将其余资源恢复为默认状态。