我有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);
}
}
答案 0 :(得分:1)
RecyclerView
会回收用户不再可见的视图。这意味着,你所做的那个INVISIBLE
在被回收时将是不可见的。
对于每个项目,您必须在holder.b1.setVisibility(View.VISIBLE);
中设置onBindViewHolder
来恢复视图状态。但是,它将重置发送到服务器端的项目。您必须实现逻辑以保存项目的状态。我们说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();
}
});
答案 1 :(得分:1)
即使我遇到了同样的问题,也有两种方法可以解决这个问题;
{你的回收者视图}.setItemViewCacheSize(9); 我发现 9 与我的代码完美配合,甚至可能应该使用 你的。
在 Your Adapter Class 中,在 onBindViewHolder 下添加一行 “holder.bind(userModal1);”
然后在ViewHolder
下创建一个名为bind的方法然后设置与您在 onBindViewHolder
中相同的 textview 、 imageview 、 button为了更好的理解,我还添加了一张照片
解决问题的第一种方法
{
}
这是第二种方法
{
}
答案 2 :(得分:0)
只需在holder.b1.setVisibility(View.VISIBLE);
之后添加此行holder.rcqty.setText(listitem.getQty());
即可。之所以发生这种情况,是因为视图被回收利用,而且在回收时发现它的可见性已经消失,这就产生了你所面临的问题。
答案 3 :(得分:0)
您需要更新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();
}
});
}
添加attr active:
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;
}
}
答案 4 :(得分:0)
我面临着同样的问题。希望经过大量研究,我找到了解决方案。
实际上,recyclerview在创建8个视图持有者之后,将重新使用已经制成的适配器。因此,如果您对它们进行了任何更改,则由于第7个视图持有者都相同,因此将继续到第7个视图持有者。
因此,要解决此问题,您每次使用时都必须初始化所有视图持有者视图。