Back

android - fragment/activity中使用 recyclerview

发布时间: 2020-02-01 06:26:00

参考:  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;
  }

}

Back