android - fragment/activity中使用 recyclerview
访问量: 1870
参考: https://developer.android.com/guide/topics/ui/layout/recyclerview
recyclerview是listview的升级版. 为了提高执行效率和用户体验.
重点是3个内容:
1. recyclerview: 最外层的东西,包含了骨架
2. adapter : 用来把数据 和 recyclerview组合到一起的
3. viewholder: 代表列表中的一行.
下面是一个例子:
1. 创建一个adapter :
public class MyOrderBookAdapter extends RecyclerView.Adapter<MyOrderBookAdapter.MyViewHolder> { private String[] myDataSet; public static class MyViewHolder extends RecyclerView.ViewHolder { public TextView amount; public MyViewHolder(TextView amount){ super(amount); this.amount = amount; } } public MyOrderBookAdapter(String[] myDataSet) { this.myDataSet = myDataSet; } /** * step1.负责创建list,这个应该是一个 */ @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { TextView v = (TextView) (LayoutInflater.from(parent.getContext()) .inflate(R.layout.my_text_view, parent, false)); MyViewHolder holder = new MyViewHolder(v); return holder; } /** * step2.负责展示数据 */ @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.amount.setText(this.myDataSet[position]); } @Override public int getItemCount() { return myDataSet.length; } }
2. 在fragment, activity中调用:
// 下面的变量 myRecyclerView是定义在对应fragment/activity中的变量,例如: RecyclerView myRecyclerView; ... myRecyclerView = (RecyclerView) findById(R.id.my_recycler_view) , 具体代码见下面。这行代码不要copy . 要根据实际情况修改 // 定义后, 在 oncreate 中调用该方法 private void initAskOrderBook(){ RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext()); myRecyclerView.setLayoutManager(layoutManager); String[] data = { "aaa", "bbb", "ccc"}; RecyclerView.Adapter myAdapter = new MyOrderBookAdapter(data); myRecyclerView.setAdapter(myAdapter); }
3. 创建一个my_text_view.xml文件:
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="30dp" android:textSize="18sp" android:text="this is my button!" > </TextView>
4. 记得在对应的fragment等xml中,增加该 RecyclerView
<androidx.recyclerview.widget.RecyclerView 这里要注意:目前是使用了androidx, 对于老系统可能会要求使用 v27 啥的。 android:id="@+id/my_recycler_view" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent"/>
5.
运行即可.
。
。
。
上面是在一个独立的环境中的写法。
下面是根据你自己的情况来完善的。(下面是我的自己项目中的一个例子。 order book 啥的不用看了。 ask_order_book 是个ProgressBar
下面是adapter 加载XML的情况:
public class MyOrderBookAdapter extends RecyclerView.Adapter<MyOrderBookAdapter.MyViewHolder> { // step3. 这里必定是一个list private List<OrderBookBean.ContentBean.DataBean.AskOrderBean> ask_orders; /** * step1.负责创建list */ @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { RelativeLayout orderLayout = (RelativeLayout) (LayoutInflater.from(parent.getContext()) .inflate(R.layout.deep_sell_progress, parent, false)); View view = View.inflate(parent.getContext(), R.layout.deep_sell_progress, null); return new MyViewHolder(view); } /** * step2.负责展示数据 */ @Override public void onBindViewHolder(MyViewHolder holder, int position) { OrderBookBean.ContentBean.DataBean.AskOrderBean askOrder = this.ask_orders.get(position); holder.ask_order_book.setProgress(position); holder.ask_order_amount.setText(askOrder.amount); holder.ask_order_price.setText(askOrder.price); } @Override public int getItemCount() { return ask_orders == null ? 0 : this.ask_orders.size(); } public static class MyViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.ask_order_book) ProgressBar ask_order_book; @BindView(R.id.ask_order_price) TextView ask_order_price; @BindView(R.id.ask_order_amount) TextView ask_order_amount; @BindView(R.id.ask_order_index) TextView ask_order_index; public MyViewHolder(View view){ super(view); ButterKnife.bind(this, view); } } public MyOrderBookAdapter(List<OrderBookBean.ContentBean.DataBean.AskOrderBean> ask_orders) { this.ask_orders = ask_orders; } }