温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Android中怎么利用RecyclerView实现列表嵌套效果

发布时间:2021-06-26 17:03:58 来源:亿速云 阅读:214 作者:Leah 栏目:移动开发

Android中怎么利用RecyclerView实现列表嵌套效果,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

1. 定义多布局对象的基类:

public class BaseMulDataModel {
  protected int type;

  public int getType() {
    return type;
  }

  public void setType(int type) {
    this.type = type;
  }
}

type是该对象对应的布局类型。

2. recyclerview数据的显示放在ViewHolder中,定义Holder基类

public abstract class BaseMulViewHolder<T extends BaseMulDataModel> extends RecyclerView.ViewHolder {

  public BaseMulViewHolder(View itemView) {
    super(itemView);
  }

  protected abstract void bindData(T dataModel);

}

这里面多布局中可能涉及到的多个对象,所以基类中的对象类型使用泛型定义,必须是多布局对象基类的子类,这样在后面数据和控件绑定的时候比较方便。

3. 开始创建多布局适配器

public class MullayoutAdapter extends RecyclerView.Adapter<BaseMulViewHolder> {

  /**
   * 定义三种布局类型
   */
  public static final int TYPE_ONE = 1;
  public static final int TYPE_TWO = 2;
  public static final int TYPE_THREE = 3;

  /**
   * 数据集合
   */
  private List<BaseMulDataModel> mList;

  @Override
  public BaseMulViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    //根据不同的布局类型,设置创建相关的holder
    switch (viewType) {
      case TYPE_ONE:
        return new ViewHolderOne(LayoutInflater.from(parent.getContext())
            .inflate(R.layout.layout_holder1, parent, false));
      case TYPE_TWO:
        return new ViewHolderTwo(LayoutInflater.from(parent.getContext())
            .inflate(R.layout.layout_holder2, parent, false));
      case TYPE_THREE:
        return new ViewHolderThree(LayoutInflater.from(parent.getContext())
            .inflate(R.layout.layout_holder3, parent, false));
    }
    return null;
  }

  @Override
  public void onBindViewHolder(BaseMulViewHolder holder, int position) {
    //绑定数据
    holder.bindData(mList.get(position));
  }

  @Override
  public int getItemCount() {
    return mList.size();
  }

  @Override
  public int getItemViewType(int position) {
    return mList.get(position).getType();
  }

  /**
   * 设置数据
   *
   * @param list
   */
  public void setDatas(List<BaseMulDataModel> list) {
    mList = list;
    notifyDataSetChanged();
  }

  public List<BaseMulDataModel> getDatas() {
    return mList;
  }

  /**
   * 设置第一个布局的数据
   */
  class ViewHolderOne extends BaseMulViewHolder<OneModel> {
    TextView textView;

    public ViewHolderOne(View itemView) {
      super(itemView);
      textView = (TextView) itemView.findViewById(R.id.holder1_tv);
    }

    @Override
    protected void bindData(OneModel dataModel) {
      textView.setText(dataModel.getTitle());
    }
  }


  /**
   * 设置第二个布局的数据
   */
  class ViewHolderTwo extends BaseMulViewHolder<TwoModel> {
    ImageView imageView;

    public ViewHolderTwo(View itemView) {
      super(itemView);
      imageView = (ImageView) itemView.findViewById(R.id.holder2_iv);
    }

    @Override
    protected void bindData(TwoModel dataModel) {
      imageView.setImageResource(dataModel.getRes());
    }


  }

  /**
   * 设置第三个布局的数据
   */
  class ViewHolderThree extends BaseMulViewHolder<ThreeModel> {
    TextView textView;

    public ViewHolderThree(View itemView) {
      super(itemView);
      textView = (TextView) itemView.findViewById(R.id.holder3_tv);
    }

    @Override
    protected void bindData(ThreeModel dataModel) {
      textView.setText(dataModel.getNote());
    }


  }

}

首先这边涉及到布局类型:头部、内容列表、底部。定义三种类型

/**
* 定义三种布局类型
*/
public static final int TYPE_ONE = 1;
public static final int TYPE_TWO = 2;
public static final int TYPE_THREE = 3;

根据布局类型来创建对应的ViewHolder对象

  public BaseMulViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    //根据不同的布局类型,设置创建相关的holder
    switch (viewType) {
      case TYPE_ONE:
        return new ViewHolderOne(LayoutInflater.from(parent.getContext())
            .inflate(R.layout.layout_holder1, parent, false));
      case TYPE_TWO:
        return new ViewHolderTwo(LayoutInflater.from(parent.getContext())
            .inflate(R.layout.layout_holder2, parent, false));
      case TYPE_THREE:
        return new ViewHolderThree(LayoutInflater.from(parent.getContext())
            .inflate(R.layout.layout_holder3, parent, false));
    }
    return null;
  }

当然事先创建对应的Holder类:

  /**
   * 设置第一个布局的数据
   */
  class ViewHolderOne extends BaseMulViewHolder<OneModel> {
    TextView textView;

    public ViewHolderOne(View itemView) {
      super(itemView);
      textView = (TextView) itemView.findViewById(R.id.holder1_tv);
    }

    @Override
    protected void bindData(OneModel dataModel) {
      textView.setText(dataModel.getTitle());
    }
  }

这边把泛型对象擦除,使用具体对象OneModel来作为当前的数据对象。OneModel是BaseMulDataModel的基类。

OneModel的定义:

public class OneModel extends BaseMulDataModel {

  private String title;

  public OneModel(String title, int type) {
    this.title = title;
    this.type = type;
  }

  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }
}

4. 进行数据处理

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    RecyclerView recycler = (RecyclerView) findViewById(R.id.recycler);
    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    recycler.setLayoutManager(layoutManager);

    final MullayoutAdapter adapter = new MullayoutAdapter();
    recycler.setAdapter(adapter);

    //数据处理
    List<BaseMulDataModel> mList = new ArrayList<>();
    for (int i = 0; i < 5; i++) {
      mList.add(new OneModel("头部" + i, MullayoutAdapter.TYPE_ONE));
      for (int j = 0; j < 3; j++) {
        mList.add(new TwoModel(R.mipmap.ic_launcher, MullayoutAdapter.TYPE_TWO));
      }
      mList.add(new ThreeModel("底部" + i, MullayoutAdapter.TYPE_THREE));
    }
    adapter.setDatas(mList);
  }
}

关于Android中怎么利用RecyclerView实现列表嵌套效果问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI