Android-RecyclerView實現Item添加和刪除
先上效果圖:
GIF/1K
1
RecyclerView簡介
RecyclerView用以下兩種方式簡化了數據的展示和處理:
1.使用LayoutManager來確定每一個item的排列方式。
2.為增加和刪除項目提供默認的動畫效果,也可以自定義。
RecyclerView項目結構如下:
Adapter:使用RecyclerView之前,你需要一個繼承自RecyclerView.Adapter的適配器,作用是將數據與每一個條目的界面進行綁定。
LayoutManager:用來確定每一個item如何進行排列擺放,何時展示和隱藏。
2
RecyclerView-Item添加
在適配器中加入如下代碼:
// 添加數據 public void addData(int position) {// 在list中添加數據,並通知條目加入一條 list.add(position, "我是商品" + position); //添加動畫 notifyItemInserted(position); }
調用時:
3
RecyclerView-Item刪除
在適配器中加入如下代碼:
// 刪除數據 public void removeData(int position) { list.remove(position); //刪除動畫 notifyItemRemoved(position); notifyDataSetChanged(); }
調用時:
//Item里的刪除 removeData(position);//外面的控制項的刪除adapter. removeData(position);
需要注意的是我再刪除動畫的下面加了notifyDataSetChanged();代碼,因為我們在刪除條目時不一定是按照順序刪除的,也許是錯位刪除,這樣會因為position的原因造成角標越界異常,所以需要整體刷新一下。
4
整體代碼
1.MainActivity
package com.android.qzs.qzsrecycleview;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.DefaultItemAnimator;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.View;import android.widget.ImageView;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity { private RecyclerView mRecyclerView; private ImageView iv_add; private RecycleAdapter adapter; private List list = new ArrayList(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initRecycle(); iv_add.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 添加自帶默認動畫 adapter.addData(list.size()); } }); } private void initRecycle() { // 縱向滑動 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(linearLayoutManager);// 獲取數據,向適配器傳數據,綁定適配器 list = initData(); adapter = new RecycleAdapter(MainActivity.this, list); mRecyclerView.setAdapter(adapter);// 添加動畫 mRecyclerView.setItemAnimator(new DefaultItemAnimator()); } private void initView() { iv_add = (ImageView) findViewById(R.id.iv_add); mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview); } protected ArrayList initData() { ArrayList mDatas = new ArrayList(); for (int i = 0; i < 1; i++) { mDatas.add("我是商品" + i); } return mDatas; }}
2.RecycleAdapter
package com.android.qzs.qzsrecycleview;import android.content.Context;import android.support.design.widget.Snackbar;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import java.util.ArrayList;import java.util.List;/** * Created by qzs on 2017/9/04. */class RecycleAdapter extends RecyclerView.Adapter { private Context context; private List list; public RecycleAdapter(Context context, List list) { this.context = context; this.list = list; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { MyViewHolder holder = new MyViewHolder(LayoutInflater.from( context).inflate(R.layout.item_home, parent, false)); return holder; } @Override public void onBindViewHolder(MyViewHolder holder, final int position) { holder.tv.setText(list.get(position)); holder.tv_delete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (list.size() == 1) { Snackbar.make(v, "此條目不能刪除", Snackbar.LENGTH_SHORT).show(); } else { // 刪除自帶默認動畫 removeData(position); } } }); } @Override public int getItemCount() { return list.size(); } // 添加數據 public void addData(int position) {// 在list中添加數據,並通知條目加入一條 list.add(position, "我是商品" + position); //添加動畫 notifyItemInserted(position); } // 刪除數據 public void removeData(int position) { list.remove(position); //刪除動畫 notifyItemRemoved(position); notifyDataSetChanged(); } /** * ViewHolder的類,用於緩存控制項 */ class MyViewHolder extends RecyclerView.ViewHolder { TextView tv, tv_delete; //因為刪除有可能會刪除中間條目,然後會造成角標越界,所以必須整體刷新一下! public MyViewHolder(View view) { super(view); tv = (TextView) view.findViewById(R.id.id_num); tv_delete = (TextView) view.findViewById(R.id.tv_delete); } }}
源碼地址:
TAG:QzsAndroidDeveloper |