回收站视图上的按钮重复单击
Button click on recycler view is repeating
我有一个RecyclerView
。数据来自服务器。列表项视图包含:
- 一个
TextView
- 一个
EditText
- 一个
Button
我有 10 个列表项。当我点击按钮时,数据将发送到服务器,提交成功后按钮可见性设置为View.INVISIBLE。问题是每第 7 个按钮也更改为不可见。数据传输工作正常。请帮助我。
绑定视图持有者
@Override
public void onBindViewHolder(final ViewHolder1 holder, final int position) {
final Ardlist_item listitem = listitems.get(position);
holder.textitemname.setText(listitem.getItemname());
holder.liftqty.setText(listitem.getQty());
holder.rcqty.setText(listitem.getQty());
holder.b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.b1.setVisibility(View.INVISIBLE);
holder.rcqty.setEnabled(false);
Toast.makeText(context, "clicled" + position, Toast.LENGTH_LONG).show();
}
});
}
获得职位
@Override
public int getItemCount() {
return listitems.size();
}
public class ViewHolder1 extends RecyclerView.ViewHolder {
public TextView liftqty;
public Button b1;
public EditText rcqty;
public ViewHolder1(View itemView) {
super(itemView);
textitemname = (TextView) itemView.findViewById(R.id.item_name);
liftqty = (TextView) itemView.findViewById(R.id.lifted_qty);
b1 = (Button) itemView.findViewById(R.id.receive_btn);
rcqty = (EditText) itemView.findViewById(R.id.received_qty);
}
}
只需在 holder.rcqty.setText(listitem.getQty());
之后添加这一行 holder.b1.setVisibility(View.VISIBLE);
就可以了。发生这种情况是因为视图被回收,并且在回收时发现它的可见性消失了,这就是您面临的问题。
您需要更新 onBindViewHolder
中的每个视图。
所以将 attr "active" 添加到您的模型并在点击后更新:
@Override
public void onBindViewHolder(final ViewHolder1 holder, final int position) {
final Ardlist_item listitem = listitems.get(position);
holder.textitemname.setText(listitem.getItemname());
holder.liftqty.setText(listitem.getQty());
holder.rcqty.setText(listitem.getQty());
holder.b1.setVisibility(listitem.isActive() ? View.VISIBLE : View.INVISIBLE); // set visibility
holder.rcqty.setEnabled(listitem.isActive());
holder.b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Ardlist_item listitem = listitems.get(position);
listitem.setActive(false); // edit active attribute
holder.b1.setVisibility(View.INVISIBLE);
holder.rcqty.setEnabled(false);
Toast.makeText(context, "clicled" + position, Toast.LENGTH_LONG).show();
}
});
}
添加属性:
class Ardlist_item {
//private boolean active = true;//chnaged
private boolean active = true;
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
}
RecyclerView
回收用户不再可见的视图。这意味着,您制作的 INVISIBLE
回收后将不可见。
对于每个项目,您必须通过在 onBindViewHolder
中设置 holder.b1.setVisibility(View.VISIBLE);
来恢复视图的状态。但是,它将重置那些发送到服务器端的项目。您必须实施逻辑来保存项目的状态。假设 listitem.isSent()
。那么你将拥有:
final Ardlist_item listitem = listitems.get(position);
holder.b1.setVisibility(listitem.isSent()? View.INVISIBLE : View.VISIBLE);
holder.textitemname.setText(listitem.getItemname());
...
holder.b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listitems.setSent(true);
holder.b1.setVisibility(View.INVISIBLE);
holder.rcqty.setEnabled(false);
Toast.makeText(context, "clicled" + position, Toast.LENGTH_LONG).show();
}
});
我遇到了同样的问题。希望经过大量研究后,我找到了解决方案。
实际上,recyclerview 创建了 8 个视图持有者,然后它重新使用了已经制作好的适配器。因此,如果您对它们进行任何更改,它将继续到每第 7 个视图持有者,因为它们都是相同的。
所以要解决这个问题,你必须在每次使用时初始化所有视图。
即使我遇到了同样的问题,也有两种方法可以解决这个问题;
{你的回收站视图}.setItemViewCacheSize(9);
我发现 9 与我的代码完美配合,甚至可能应该与
你的。
在你的适配器Class中,在onBindViewHolder下添加一行
" holder.bind(userModal1); "
然后在ViewHolder
下创建一个名为bind的方法
然后设置与 onBindViewHolder
中相同的 textview 、 imageview 、 button
为了更好地理解我也添加了一张照片
第一种解决问题的方法
{
cache one
}
这是第二种方法
{
onBindViewHolder
ViewHolder---method bind
}
我有一个RecyclerView
。数据来自服务器。列表项视图包含:
- 一个
TextView
- 一个
EditText
- 一个
Button
我有 10 个列表项。当我点击按钮时,数据将发送到服务器,提交成功后按钮可见性设置为View.INVISIBLE。问题是每第 7 个按钮也更改为不可见。数据传输工作正常。请帮助我。
绑定视图持有者
@Override
public void onBindViewHolder(final ViewHolder1 holder, final int position) {
final Ardlist_item listitem = listitems.get(position);
holder.textitemname.setText(listitem.getItemname());
holder.liftqty.setText(listitem.getQty());
holder.rcqty.setText(listitem.getQty());
holder.b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.b1.setVisibility(View.INVISIBLE);
holder.rcqty.setEnabled(false);
Toast.makeText(context, "clicled" + position, Toast.LENGTH_LONG).show();
}
});
}
获得职位
@Override
public int getItemCount() {
return listitems.size();
}
public class ViewHolder1 extends RecyclerView.ViewHolder {
public TextView liftqty;
public Button b1;
public EditText rcqty;
public ViewHolder1(View itemView) {
super(itemView);
textitemname = (TextView) itemView.findViewById(R.id.item_name);
liftqty = (TextView) itemView.findViewById(R.id.lifted_qty);
b1 = (Button) itemView.findViewById(R.id.receive_btn);
rcqty = (EditText) itemView.findViewById(R.id.received_qty);
}
}
只需在 holder.rcqty.setText(listitem.getQty());
之后添加这一行 holder.b1.setVisibility(View.VISIBLE);
就可以了。发生这种情况是因为视图被回收,并且在回收时发现它的可见性消失了,这就是您面临的问题。
您需要更新 onBindViewHolder
中的每个视图。
所以将 attr "active" 添加到您的模型并在点击后更新:
@Override
public void onBindViewHolder(final ViewHolder1 holder, final int position) {
final Ardlist_item listitem = listitems.get(position);
holder.textitemname.setText(listitem.getItemname());
holder.liftqty.setText(listitem.getQty());
holder.rcqty.setText(listitem.getQty());
holder.b1.setVisibility(listitem.isActive() ? View.VISIBLE : View.INVISIBLE); // set visibility
holder.rcqty.setEnabled(listitem.isActive());
holder.b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Ardlist_item listitem = listitems.get(position);
listitem.setActive(false); // edit active attribute
holder.b1.setVisibility(View.INVISIBLE);
holder.rcqty.setEnabled(false);
Toast.makeText(context, "clicled" + position, Toast.LENGTH_LONG).show();
}
});
}
添加属性:
class Ardlist_item {
//private boolean active = true;//chnaged
private boolean active = true;
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
}
RecyclerView
回收用户不再可见的视图。这意味着,您制作的 INVISIBLE
回收后将不可见。
对于每个项目,您必须通过在 onBindViewHolder
中设置 holder.b1.setVisibility(View.VISIBLE);
来恢复视图的状态。但是,它将重置那些发送到服务器端的项目。您必须实施逻辑来保存项目的状态。假设 listitem.isSent()
。那么你将拥有:
final Ardlist_item listitem = listitems.get(position);
holder.b1.setVisibility(listitem.isSent()? View.INVISIBLE : View.VISIBLE);
holder.textitemname.setText(listitem.getItemname());
...
holder.b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listitems.setSent(true);
holder.b1.setVisibility(View.INVISIBLE);
holder.rcqty.setEnabled(false);
Toast.makeText(context, "clicled" + position, Toast.LENGTH_LONG).show();
}
});
我遇到了同样的问题。希望经过大量研究后,我找到了解决方案。
实际上,recyclerview 创建了 8 个视图持有者,然后它重新使用了已经制作好的适配器。因此,如果您对它们进行任何更改,它将继续到每第 7 个视图持有者,因为它们都是相同的。
所以要解决这个问题,你必须在每次使用时初始化所有视图。
即使我遇到了同样的问题,也有两种方法可以解决这个问题;
{你的回收站视图}.setItemViewCacheSize(9); 我发现 9 与我的代码完美配合,甚至可能应该与 你的。
在你的适配器Class中,在onBindViewHolder下添加一行 " holder.bind(userModal1); "
然后在ViewHolder
下创建一个名为bind的方法然后设置与 onBindViewHolder
中相同的 textview 、 imageview 、 button
为了更好地理解我也添加了一张照片
第一种解决问题的方法
{
cache one
}
这是第二种方法
{
onBindViewHolder
ViewHolder---method bind
}