最近项目中有一个需求是RecyclerView中的Item中嵌套RecyclerView,在网上没找到什么资料,然后就自己尝试了一下。

首先看一下效果图

录制GIF现在不大方便,就直接上两个图了。

关于RecyclerView,都已经很熟悉了不熟悉的去百度一下,这里就不多介绍了。

先说一下需求,最外层的是一个RecyclerView是竖向的,然后外层RecyclerView里面Item中的RecyclerView是GridManager。

我们先看一下具体的代码:

最外层的布局代码:

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/rvMultipleItem"

android:layout_width="match_parent"

android:layout_height="match_parent"/>

public class MultipleActivity extends AppCompatActivity {

private static final String TAG = "MultipleActivity";

RecyclerView mRecyclerView;

TopCategoryBean mCategoryBean = new TopCategoryBean();

MultipleAdapter mMultipleAdapter;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_multiple);

mRecyclerView = (RecyclerView) findViewById(R.id.rvMultipleItem);

mMultipleAdapter = new MultipleAdapter(this, mCategoryBean);

mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

new Thread(new Runnable() {

@Override

public void run() {

try {

URL url = new URL("http://api.zhuishushenqi.com/cats/lv2/statistics");

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

urlConnection.setRequestMethod("GET");

urlConnection.setConnectTimeout(60000);

urlConnection.setConnectTimeout(10000);

int responseCode = urlConnection.getResponseCode();

if (responseCode == 200) {

InputStream inputStream = urlConnection.getInputStream();

BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

StringBuilder sb = new StringBuilder();

String line = null;

while ((line = reader.readLine()) != null) {

sb.append(line);

}

Gson gson = new Gson();

final TopCategoryBean categoryBean = gson.fromJson(sb.toString(), TopCategoryBean.class);

Log.i(TAG,"-------->"+categoryBean);

runOnUiThread(new Runnable() {

@Override

public void run() {

mMultipleAdapter.setCategoryBean(categoryBean);

mRecyclerView.setAdapter(mMultipleAdapter);

}

});

}

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}).start();

}

}

最外层的布局文件就是一个RecyclerView控件,然后在Java代码中必须要设置LinearLayoutManager,然后就没什么很难的实现了。

接着是适配器的代码:

public class MultipleAdapter extends RecyclerView.Adapter {

private static final String TAG = "MultipleAdapter";

private Context mContext;

private LayoutInflater mInflater;

private TopCategoryBean mCategoryBean;

public MultipleAdapter(Context context, TopCategoryBean categoryBean) {

mContext = context;

mInflater = LayoutInflater.from(mContext);

mCategoryBean = categoryBean;

}

public void setCategoryBean(TopCategoryBean categoryBean) {

mCategoryBean = categoryBean;

notifyDataSetChanged();

}

@Override

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

View view = mInflater.inflate(R.layout.item_multiple_normal, parent, false);

return new NormalItemViewHolder(view);

}

@Override

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

NormalItemViewHolder viewHolder = (NormalItemViewHolder) holder;

RecyclerView rvCategory = viewHolder.mRvCategory;

rvCategory.setHasFixedSize(true);

rvCategory.setLayoutManager(new GridLayoutManager(mContext, 3));

List male = mCategoryBean.getMale();

List female = mCategoryBean.getFemale();

CategoryAdapter adapter = new CategoryAdapter(male);

if (position == 0) {

viewHolder.mTextView.setText("男生");

adapter.setCategoryBeans(male);

} else if (position == 1) {

viewHolder.mTextView.setText("女生");

adapter.setCategoryBeans(female);

} else if (position == 2) {

viewHolder.mTextView.setText("耽美");

adapter.setCategoryBeans(mCategoryBean.getPicture());

} else if (position == 3) {

viewHolder.mTextView.setText("出版");

adapter.setCategoryBeans(mCategoryBean.getPress());

}

rvCategory.setAdapter(adapter);

}

@Override

public int getItemCount() {

return 4;

}

private class CategoryAdapter extends RecyclerView.Adapter {

List mCategoryBeans;

public CategoryAdapter(List maleBeans) {

mCategoryBeans = maleBeans;

}

public void setCategoryBeans(List categoryBeans) {

mCategoryBeans = categoryBeans;

notifyDataSetChanged();

}

@Override

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

View view = mInflater.inflate(R.layout.item_category, parent, false);

return new ItemViewHolder(view);

}

@Override

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

ItemViewHolder viewHolder = (ItemViewHolder) holder;

final TopCategoryBean.MaleBean maleBean = mCategoryBeans.get(position);

viewHolder.mTvBookCount.setText(maleBean.getBookCount() + "本");

viewHolder.mTvCategoryName.setText(maleBean.getName());

viewHolder.itemView.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

}

});

}

@Override

public int getItemCount() {

return mCategoryBeans.size();

}

class ItemViewHolder extends RecyclerView.ViewHolder {

TextView mTvCategoryName;

TextView mTvBookCount;

CardView llItem;

public ItemViewHolder(View itemView) {

super(itemView);

mTvCategoryName = itemView.findViewById(R.id.tvCategoryName);

mTvBookCount = itemView.findViewById(R.id.tvBookCount);

llItem = itemView.findViewById(R.id.llItem);

}

}

}

private class NormalItemViewHolder extends RecyclerView.ViewHolder {

TextView mTextView;

RecyclerView mRvCategory;

public NormalItemViewHolder(View itemView) {

super(itemView);

mTextView = itemView.findViewById(R.id.tvName);

mRvCategory = itemView.findViewById(R.id.rvCategory);

}

}

}

适配器这里我没做封装,直接用最原始的写法,需要注意的一点是:我这里最外层的Item数只有4个,我就直接写死了4个,具体的项目中而已根据需求来实现。

外层Item的布局代码:

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginEnd="3dp"

android:layout_marginStart="3dp"

android:layout_marginTop="3dp"

android:orientation="vertical"

android:padding="10dp"

app:cardCornerRadius="3dp"

app:cardElevation="3dp">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="vertical">

android:id="@+id/tvName"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:padding="10dp"

android:text="男生"

android:textSize="16sp"/>

android:layout_width="match_parent"

android:layout_height="1dp"

android:layout_marginEnd="2dp"

android:layout_marginStart="10dp"

android:background="#FF0000"/>

android:id="@+id/rvCategory"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginStart="5dp"

android:padding="10dp"/>

这个布局里面用了一个recyclerView控件。我们需要在最外层的适配器中给这个RecyclerView添加一个适配器。

private class CategoryAdapter extends RecyclerView.Adapter {

List mCategoryBeans;

public CategoryAdapter(List maleBeans) {

mCategoryBeans = maleBeans;

}

public void setCategoryBeans(List categoryBeans) {

mCategoryBeans = categoryBeans;

notifyDataSetChanged();

}

@Override

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

View view = mInflater.inflate(R.layout.item_category, parent, false);

return new ItemViewHolder(view);

}

@Override

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

ItemViewHolder viewHolder = (ItemViewHolder) holder;

final TopCategoryBean.MaleBean maleBean = mCategoryBeans.get(position);

viewHolder.mTvBookCount.setText(maleBean.getBookCount() + "本");

viewHolder.mTvCategoryName.setText(maleBean.getName());

viewHolder.itemView.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

}

});

}

@Override

public int getItemCount() {

return mCategoryBeans.size();

}

class ItemViewHolder extends RecyclerView.ViewHolder {

TextView mTvCategoryName;

TextView mTvBookCount;

CardView llItem;

public ItemViewHolder(View itemView) {

super(itemView);

mTvCategoryName = itemView.findViewById(R.id.tvCategoryName);

mTvBookCount = itemView.findViewById(R.id.tvBookCount);

llItem = itemView.findViewById(R.id.llItem);

}

}

}

这是里面适配器的代码,使用的时候跟别的地方使用一样,需要注意的是布局管理器设置成GridLayoutManager,因为需求里面是GridLayout的,这样就能实现RecyclerView里面嵌套RecyclerView。

这里写的不是很好,具体需要了解的可以去看一下代码:传送门

android recyclerview,AndroidRecyclerView中的Item嵌套RecyclerView使用实例相关推荐

  1. android 继承relativelayout,Android自定义View(RelativeLayout),并嵌套(recyclerView)

    自定义view嵌套使用,简单操作. 一:简单的自定义view(relativeLayout) public class ViewRelativeLayout extends RelativeLayou ...

  2. Android处理ListView中的Item中的Button按钮不能点击的问题

    问题描述:ListView列表中的Button按钮按钮不能点击 解决办法:在ListView中的Item项的布局文件中加上:android:descendantFocusability="b ...

  3. Android 取得 ListView中每个Item项目的值

    首先我们须要创建 ListView .这里假定我们已经创建好了而且使用SimpleAdapter设置好了adapter数据,看一下我们的adapter ArrayList<HashMap< ...

  4. Python中的If嵌套讲解(语法、实例、执行流程)

    If就是if条件语句,嵌套的意思可以理解为在生活当中有种玩具叫做俄罗斯套娃,这个套娃呢就是大的套娃里面有小的娃,小娃里面有更小的娃,就这样一层一层的套下去.在编程语言当中,if嵌套指代的意思是一个大的 ...

  5. Android中RecyclerView嵌套RecyclerView或嵌套ListView

    Android中RecyclerView嵌套RecyclerView或嵌套ListView

  6. Android中当item数量超过一定大小RecyclerView高度固定

    Android中当item数量超过一定大小时,将RecyclerView高度固定 方法1 直接通过LayoutParams来设定相应高度 ViewGroup.LayoutParams lp = rv. ...

  7. Android 高级UI设计笔记20:RecyclerView 的详解之RecyclerView添加Item点击事件

    1. 引言: RecyclerView侧重的是布局的灵活性,虽说可以替代ListView但是连基本的点击事件都没有,这篇文章就来详细讲解如何为RecyclerView的item添加点击事件,顺便复习一 ...

  8. Android SrcollView嵌套recyclerView的使用

    今天,简单讲讲Android里使用SrcollView嵌套recyclerView需要注意的地方. 不废话了直接上代码,在使用时加上下面的代码就可以 recyclerView.setLayoutMan ...

  9. Android添加item动画,RecyclerView基础篇-Item添加动画

    Android_Banner.jpg 简介 本节中我们介绍下给RecyclerView中的Item添加动画. 添加的动画,分为,在打开列表时有Item的展示动画,当滑动的时候没有动画 和打开列表滑动时 ...

最新文章

  1. Makefile之大型工程项目子目录Makefile的一种通用写法
  2. 《剑指offer》-数组中只出现一次的数字
  3. acrgis api for javaScript需要对Dojo了解多少?
  4. restTemplate使用和踩坑总结
  5. liunx php apache2,linux apache2部署php
  6. 蚌埠学院计算机科学技术校区,蚌埠学院计算机科学与关键技术(6页)-原创力文档...
  7. zklib php,php 安装zookeeper扩展报错
  8. 深圳市龙岗职业技术学校录取分数线计算机,深圳市龙岗区第二职业技术学校2021年招生录取分数线...
  9. string字符串的高级用法
  10. EasyPermisson 动态权限使用例子
  11. MATLAB获取系统时间
  12. jmeter定时器的使用_Jmeter的九种定时器解析
  13. 拓端tecdat|R语言预测期货波动率的实现:ARCH与HAR-RV与GARCH,ARFIMA模型比较
  14. “一云多Region”究竟能为企业解决什么问题?
  15. 文档隐写溯源技术分析
  16. NLPIR-JAVA版本-MAC-LINUX-WINDOWS操作系统均适用
  17. 常见的网络命令--ping.hostname
  18. 编程艺术——软件设计模式SOLID原则
  19. 京东、腾讯历经最难Q1
  20. 覆盖网络(Overlay Network)

热门文章

  1. 171231 逆向-64位系统
  2. [Hades_ping]哈迪斯ping与视频教程
  3. 如何用Cocos Creator做一个胶体(果冻效果)小游戏(四)+测试收尾
  4. 陌陌,该甩掉你“约炮”的帽子了
  5. 新浪微博数据抓取(java实现)
  6. DateTime.now()用法
  7. python——画蛇形线条
  8. 中科大计算机对比重庆大学,985工程院校实力排名:中科大仅排第16名?看看你喜欢哪所...
  9. sqlalchemy sequence
  10. 计算机知识对于老师的帮助,感念师恩·每日之星 | 帮助学生打通计算机专业学习的“任督”二脉——记第十六届“我心目中的好老师”、计算机科学与技术学院黄秋波老师...