安卓recycleview
阿新 • • 發佈:2018-11-25
list.java (主類)
RecyclerView recyclerView = findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(this)); final List<Book> data = new ArrayList<>(); for(int i = 0; i < 20; i++) { Book b = new Book("book"+i,"100"); data.add(b); } final MyRecyclerViewAdapter myAdapter = new MyRecyclerViewAdapter<Book>(this, R.layout.item, data) { @Override public void convert(MyViewHolder holder, Book s) { // Colloction是自定義的一個類,封裝了資料資訊,也可以直接將資料做成一個Map,那麼這裡就是Map<String, Object> TextView name = holder.getView(R.id.name); name.setText(s.getBookName()); TextView price = holder.getView(R.id.price); price.setText(s.getBookPrice()); } }; recyclerView.setAdapter(myAdapter);
自定義Adapter
public abstract class MyRecyclerViewAdapter<T> extends RecyclerView.Adapter<MyViewHolder> { private List<T> data; private Context context; public abstract void convert(MyViewHolder holder, T t); public MyRecyclerViewAdapter(Context _context, int _layoutId, List _data) { data = _data; context = _context; } public int getItemCount() { return data.size(); } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { MyViewHolder holder = MyViewHolder.get(context, parent, R.layout.item); return holder; } @Override public void onBindViewHolder(final MyViewHolder holder, final int position) { convert(holder, data.get(position)); // convert函式需要重寫,下面會講 holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { data.remove(position); notifyDataSetChanged(); // notifyItemRemoved(position); // notifyItemRangeChanged(position, getItemCount()); Toast.makeText(context, "刪除"+position, Toast.LENGTH_SHORT).show(); } }); // holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { // @Override // public boolean onLongClick(View view) { // data.remove(position); // notifyDataSetChanged(); // Toast.makeText(context, "刪除"+position, Toast.LENGTH_SHORT).show(); // return false; // true 表示已經完整地處理了事件,不希望其他回撥方法再處理 // } // }); } }
自定義ViewHolder
public class MyViewHolder extends RecyclerView.ViewHolder{ private SparseArray<View> views; private View view; public MyViewHolder(Context _context, View _view, ViewGroup _viewGroup){ super(_view); view = _view; views = new SparseArray<View>(); } public static MyViewHolder get(Context _context, ViewGroup _viewGroup, int _layoutId) { View _view = LayoutInflater.from(_context).inflate(_layoutId, _viewGroup, false); MyViewHolder holder = new MyViewHolder(_context, _view, _viewGroup); return holder; } public <T extends View> T getView(int _viewId) { View _view = views.get(_viewId); if (_view == null) { // 建立view _view = view.findViewById(_viewId); // 將view存入views views.put(_viewId, _view); } return (T)_view; } }
主xml
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
列表項xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_marginTop="4dp"
android:background="@android:color/white"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/name"
android:layout_width="100dp"
android:layout_height="match_parent"/>
<TextView
android:id="@+id/price"
android:layout_width="100dp"
android:layout_height="match_parent"/>
</LinearLayout>
資料的類
public class Book {
private String bookName;
private String bookPrice;
public Book(String bookName, String bookPrice) {
this.bookName = bookName;
this.bookPrice = bookPrice;
}
public String getBookName() {
return bookName;
}
public String getBookPrice() {
return bookPrice;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public void setBookPrice(String bookPrice) {
this.bookPrice = bookPrice;
}
}