RecyclerView显示列表中已删除的数据

时间:2016-02-07 16:51:38

标签: java android android-recyclerview

我已使用收件箱样式滑动视图实施了RecyclerView。刷卡时,我使用以下方法删除了列表项:

public void removeItem(int position) {
    countries.remove(position);
    notifyItemRemoved(position);
}

类似地,当按下FAB时,我使用方法

添加数据
public void addItem(String country) {
    countries.add(country);
    notifyItemInserted(countries.size());
}

但是,当我通过滑动删除数据项时,它会从ArrayListRecyclerView列表中删除,但是当我通过FAB添加数据时,删除的数据仍会显示在列表中。我检查了ArrayList数据集。这是预期的。

enter image description here

在上面的屏幕截图中,您可以看到String Test是新添加的数据。我已经删除了最后两行的数据。随机显示。

我的适配器和活动的完整代码。

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> {
    private ArrayList<String> countries;
    private TextView tv_country;


    public DataAdapter(ArrayList<String> countries) {
        this.countries = countries;
    }

    @Override
    public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_layout, viewGroup, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(DataAdapter.ViewHolder viewHolder, int i) {

        tv_country.setText(countries.get(i));
    }

    @Override
    public int getItemCount() {
        return countries.size();
    }

    public void addItem(String country) {
        countries.add(country);
        notifyItemInserted(countries.size());
    }

    public void removeItem(int position) {
        countries.remove(position);
        notifyItemRemoved(position);
    }
    public class ViewHolder extends RecyclerView.ViewHolder{
        public ViewHolder(View view) {
            super(view);

            tv_country = (TextView)view.findViewById(R.id.tv_country);
        }
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private ArrayList<String> countries =  new ArrayList<>();
    private DataAdapter adapter;
    private RecyclerView recyclerView;
    private  RecyclerView.LayoutManager layoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initViews();
    }

    private void initViews(){
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(this);
        recyclerView = (RecyclerView)findViewById(R.id.card_recycler_view);
        recyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(layoutManager);
        adapter = new DataAdapter(countries);
        recyclerView.setAdapter(adapter);
        countries.add("Australia");
        countries.add("India");
        countries.add("United States of America");
        countries.add("Germany");
        countries.add("Russia");
        adapter.notifyDataSetChanged();

        ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
                int position = viewHolder.getAdapterPosition();

                if (direction == ItemTouchHelper.LEFT){

                    adapter.removeItem(position);

                }
            }

            @Override
            public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
                Paint p = new Paint();
                Bitmap icon;
                if(actionState == ItemTouchHelper.ACTION_STATE_SWIPE){

                    View itemView = viewHolder.itemView;

                    if(dX > 0){
                        p.setColor(Color.parseColor("#388E3C"));
                        c.drawRect((float) itemView.getLeft(), (float) itemView.getTop(), dX,(float) itemView.getBottom(), p);
                        icon = BitmapFactory.decodeResource(
                                getResources(), R.drawable.ic_edit_white);
                        float height = (float) itemView.getBottom() - (float) itemView.getTop();
                        float width = height / 3;
                        RectF dest = new RectF((float) itemView.getLeft() + width ,(float) itemView.getTop() + width,(float) itemView.getLeft()+ width+width,(float)itemView.getBottom() - width);
                        c.drawBitmap(icon,null,dest,p);
                    } else {
                        p.setColor(Color.parseColor("#D32F2F"));
                        c.drawRect((float) itemView.getRight() + dX, (float) itemView.getTop(),(float) itemView.getRight(), (float) itemView.getBottom(), p);
                        icon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_delete_white);
                        float height = (float) itemView.getBottom() - (float) itemView.getTop();
                        float width = height / 3;
                        RectF dest = new RectF((float) itemView.getRight() - width - width ,(float) itemView.getTop() + width,(float) itemView.getRight() - width,(float)itemView.getBottom() - width);
                        c.drawBitmap(icon,null,dest,p);
                    }
                }

                super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
            }
        };

        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
        itemTouchHelper.attachToRecyclerView(recyclerView);

    }

    @Override
    public void onClick(View v) {

        switch (v.getId()){
            case R.id.fab:
                adapter.addItem("Test");
                Log.d("Raj",countries.toString());
                break;
        }
    }
}

我尝试了什么

我尝试过这样使用notifyItemRangeChanged()

public void removeItem(int position) {
    countries.remove(position);
    notifyItemRemoved(position);
    notifyItemRangeChanged(position, countries.size());
}

3 个答案:

答案 0 :(得分:1)

我无法确定这会解决您的问题,但有一点不正确的是您如何绑定数据。 tv_country不应该是DataAdapter的一部分;它应该是每个ViewHolder的一部分。我们使用ViewHolder模式的原因之一是保持对每行中视图的简单引用。

你的绑定方法应该类似于:

public void onBindViewHolder(DataAdapter.ViewHolder viewHolder, int i) {
    viewHolder.tv_country.setText(countries.get(i));
}

并确保tv_country成为内部ViewHolder类的公共字段。

public class ViewHolder extends RecyclerView.ViewHolder{
    public TextView tv_country;
    public ViewHolder(View view) {
        super(view);
        tv_country = (TextView) view.findViewById(R.id.tv_country);
    }
}

答案 1 :(得分:1)

我不确定我是否理解100%的情况,但为什么你真的想让自己动起来?如果我记得正确的话,你实施getItemId()hasStableIds(),你应该告诉recyclerview哪个元素被删除或添加(就像你实际做的那样)。

答案 2 :(得分:1)

onSwiped方法中添加viewHolder.setIsRecyclable(false);