在删除项

时间:2017-03-12 14:18:31

标签: android android-recyclerview

带有工作代码的文件来测试我的问题,你必须添加2个项目,然后删除其中任何一项,然后添加一个新项目以查看删除的内容如何在新添加的项目之上

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

从recyclerview删除项目时出现问题,当我删除项目时,如果我添加新项目,删除的项目将显示在新添加的项目的顶部,我怎样才能获得新视图或这是一个很大的问题。

这是我从主要活动中添加项目的方式

                            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():

这里是我的recyler

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

1 个答案:

答案 0 :(得分:1)

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

此方法存在的问题:

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),您可以手动为Recyclerview创建的视图添加额外的视图。删除这些视图后,下次按“添加”时会缓存并重复使用这些视图。问题是缓存的视图仍然包含所有手动添加的视图,因此您可以在现有视图下添加更多视图。

正如您在上面的代码中看到的那样,我添加了container.removeAllViews();,删除了先前添加的视图,确保在开始向其添加额外视图之前“Container”为空。

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

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