gpt4 book ai didi

android - 删除项目时 Recyclerview 清除查看器

转载 作者:行者123 更新时间:2023-11-30 00:39:35 24 4
gpt4 key购买 nike

包含工作代码的文件来测试我的问题,你必须添加 2 个项目,然后删除其中的任何项目,然后添加一个新项目以查看删除的项目如何覆盖新添加的项目

https://www.dropbox.com/s/ojuyz5g5f3kaz0h/Test.zip?dl=0

我在从 recyclerview 中删除一个项目时遇到问题,每当我删除一个项目时,如果我添加一个新项目,删除的项目将出现在新添加的项目的顶部,我怎么能得到一个新的 View 或避免这种情况发生是一个大问题。

这就是我从主要 Activity 中添加项目的方式

                            if (!resta || (diff > (3*60*1000)))
{
Ri.add(dataroot);
Integer position = adapter.getItemCount() + 1;
adapter.notifyItemInserted(position);
}

这是我的适配器

public class ComandaAdapter extends RecyclerView.Adapter<ComandaAdapter.ComandaAdapterViewHolder>{

private Context mContext;

private ArrayList<Integer> lista_entradas = new ArrayList<>();
private ArrayList<Integer> lista_fondos = new ArrayList<>();
private ArrayList<Integer> lista_postres= new ArrayList<>();

private Boolean primeritem;

private ArrayList<DataRoot> Rir;

private TextView txt_comandas;
private TextView txt_entracola;
private TextView txt_fondocola;
private TextView txt_postrecola;

public ComandaAdapter(Context context, TextView tx_entracola, TextView tx_fondocola, TextView tx_postrecola, TextView tx_comandas, ArrayList<DataRoot> Rir)
{
this.mContext = context;
this.txt_comandas = tx_comandas;
this.txt_entracola = tx_entracola;
this.txt_fondocola = tx_fondocola;
this.txt_postrecola = tx_postrecola;
this.Rir= Rir;
}

@Override
public ComandaAdapter.ComandaAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
return new ComandaAdapter.ComandaAdapterViewHolder(LayoutInflater.from(mContext).inflate(R.layout.row,parent,false));
}

@Override
public void onBindViewHolder(final ComandaAdapter.ComandaAdapterViewHolder holder, final int position)
{

DataRoot Rdata = Rir.get(position);
holder.setdata(Rdata);


}

public void delete(int position)
{
Rir.remove(position);
notifyItemRemoved(position);
}

public class ComandaAdapterViewHolder extends RecyclerView.ViewHolder
{
Button btn_cerrar;

public ComandaAdapterViewHolder(View itemView)
{
super(itemView);

btn_cerrar = (Button) itemView.findViewById(R.id.btn_cerrar);

void setData(final DataRoot Rdata)
{


btn_cerrar.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
btn_cerrar.setEnabled(false);
btn_cerrar.setBackgroundTintList(mContext.getColorStateList(R.color.cboff));
updateRetrofitEstadoorden(Rdata.get_id());
updateRetrofitNrocomanda(Rdata.get_id(), txt_comanda.getText().toString());
delete(getAdapterPosition());
}
});

Rdata.gerOrder();
creaboton():

这是我的回收商

private void setAdapter()
{
adapter = new ComandaAdapter(this, txt_entracola, txt_fondocola, txt_postrecola, txt_comandas, Ri);
recyclerView.getRecycledViewPool().setMaxRecycledViews(-1, Ri.size());//va en 0 supuestamente -1 es default
recyclerView.setItemViewCacheSize(Ri.size()); //ver si hay que cambiar con cada item
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());

recyclerView.setAdapter(adapter);
}

在此先感谢您的帮助。

显示问题的图像

enter image description here

enter image description here

enter image description here

最佳答案

您正在以非常不标准的方式使用 Recyclerview。您看到的问题是因为 View 正在被回收(因为它们应该在 Recyclerview 中)但您没有从以前的 View 中清除项目。

该方法存在的问题:

public void setData(String value) {

container.removeAllViews(); // Remove all previously added views

textview.setText(value);

Random r = new Random();
int i1 = r.nextInt(5 - 1) + 1;

for (int i = 0; i < i1; i++) {
be = new Button(mContext);
be.setText("Boton " + i);
be.setLayoutParams(new LinearLayout.LayoutParams(240, LinearLayout.LayoutParams.WRAP_CONTENT));
container.addView(be);
}

}

通过调用 container.addView(be),您可以手动将额外的 View 添加到 Recyclerview 创建的 View 中。当您删除这些 View 时,它们将被缓存并在您下次按“添加”时重新使用。问题是缓存的 View 仍然包含所有手动添加的 View ,因此您要在现有 View 下添加更多 View 。

正如您在上面的代码中看到的,我添加了 container.removeAllViews();,它删除了之前添加的 View ,确保在开始添加额外 View 之前“Container”为空

此外,除非您有非常具体的理由这样做,否则我会删除这些行,因为我认为您拥有它们会损害性能:

list.getRecycledViewPool().setMaxRecycledViews(-1, index);
list.setItemViewCacheSize(index);

关于android - 删除项目时 Recyclerview 清除查看器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42748494/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com