1. 程式人生 > >安卓recycleview

安卓recycleview

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;
    }
}