热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

RecyclerView优雅实现复杂列表布局

这篇文章主要为大家详细介绍了RecyclerView优雅实现复杂列表布局,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

这次学习的内容是使用RecyclerView来实现一些较为复杂的布局,比如一个item:

最左边是一个imageview,中间部分为textView,textView下面又是一个textView,最右边为一个imageview。

1、首先在activity_main.xml中添加RecyclerView,随后正如之前所说的分别针对左中右新建3个XML布局文件命名为item_type_one、two、three.随后对其进行布局配置。

2、新建一个adapter添加模拟数据。然后针对布局新建三个viewholder。随后新建一个抽象类TypeAbstractViewHolder,将三个viewholder用到的同一个方法封装起来调用,将三个viewHolder继承自抽象类。为了优雅。

activity_main.xml:

<&#63;xml version="1.0" encoding="utf-8"&#63;>


 

 

item_type_one.xml:

<&#63;xml version="1.0" encoding="utf-8"&#63;>


 

 

item_type_two.xml:

<&#63;xml version="1.0" encoding="utf-8"&#63;>


 

 

  

  

 


item_type_three.xml:

<&#63;xml version="1.0" encoding="utf-8"&#63;>


 

 

 

  

  

 


这边提一个小技巧,一般textview如果不设置文本内容的话是无法预览的,这里我们在属性中添加一个:tools:text=”abc”;
这个时候abc就会在UI上面显示出来了,而且abc也不用加入string.xml.

Java文件:

MAinActivity.class

package com.example.tony.recyclerviewdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

 private RecyclerView mRecyclerView;

 private DemoAdapter mAdapter;

 int colors[] = {android.R.color.holo_blue_light,
     android.R.color.holo_orange_light,
     android.R.color.holo_red_light};

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  mRecyclerView = (RecyclerView) findViewById(R.id.recycleView);
  mRecyclerView.setLayoutManager(new LinearLayoutManager(this,
    LinearLayoutManager.VERTICAL, false));
  mAdapter = new DemoAdapter(this);
  mRecyclerView.setAdapter(mAdapter);

  initData();
 }

 private void initData() {
  List list = new ArrayList<>();

  for (int i = 0; i <20; i++) {
   int type = (int) (Math.random() * 3 + 1);
   DataModel data = new DataModel();
   data.avatarColor = colors[type - 1];
   data.type = type;
   data.name = "Name: " + i;
   data.cOntent= "Content: " + i;
   data.cOntentColor= colors[(type + 1) % 3];
   list.add(data);
  }
  mAdapter.addList(list);
  mAdapter.notifyDataSetChanged();
 }
}

DemoAdapter.class

package com.example.tony.recyclerviewdemo;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.ViewGroup;

import java.util.ArrayList;
import java.util.List;

/*
 * Created by Tony on 2016/12/3.
 */

public class DemoAdapter extends RecyclerView.Adapter{


 private LayoutInflater mLayoutInflater;

 private List mList = new ArrayList<>();

 public DemoAdapter(Context context) {
  mLayoutInflater = LayoutInflater.from(context);
 }

 public void addList(List list) {
  mList.addAll(list);
 }

 @Override
 public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  switch (viewType) {
   case DataModel.TYPE_ONE:
    return new TypeOneViewHolder(mLayoutInflater.inflate(R.layout.item_type_one, parent, false));
   case DataModel.TYPE_TWO:
    return new TypeTwoViewHolder(mLayoutInflater.inflate(R.layout.item_type_two, parent, false));
   case DataModel.TYPE_THREE:
    return new TypeThreeViewHolder(mLayoutInflater.inflate(R.layout.item_type_three, parent, false));
  }
  return null;
 }


 @Override
 public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
  ((TypeAbstractViewHolder) holder).bindHolder(mList.get(position));
 }

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

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

DataModel.class

package com.example.tony.recyclerviewdemo;

/**
 * Created by Tony on 2016/12/3.
 */

public class DataModel {

 public static final int TYPE_OnE= 1;
 public static final int TYPE_TWO = 2;
 public static final int TYPE_THREE = 3;
 public int type;
 public int avatarColor;
 public String name;
 public String content;
 public int contentColor;
}

TypeAbstractViewHolder.class

package com.example.tony.recyclerviewdemo;

import android.support.v7.widget.RecyclerView;
import android.view.View;

/**
 * Created by Tony on 2016/12/3.
 */

public abstract class TypeAbstractViewHolder extends RecyclerView.ViewHolder{

 public TypeAbstractViewHolder(View itemView) {
  super(itemView);
 }
 public abstract void bindHolder(DataModel model);
}

TypeOneViewHolder.class

package com.example.tony.recyclerviewdemo;

import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Created by Tony on 2016/12/3.
 */

public class TypeOneViewHolder extends TypeAbstractViewHolder {

 private ImageView avatar;
 private TextView name;
 public TypeOneViewHolder(View itemView) {
  super(itemView);

  avatar = (ImageView) itemView.findViewById(R.id.avatar);
  name = (TextView) itemView.findViewById(R.id.name);
 }
 //ViewHolder数据和外面数据绑定起来
 @Override
 public void bindHolder(DataModel model) {
  avatar.setBackgroundResource(model.avatarColor);
  name.setText(model.name);
 }
}

TypeTwoViewHolder.class

package com.example.tony.recyclerviewdemo;

import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Created by Tony on 2016/12/3.
 */

public class TypeTwoViewHolder extends TypeAbstractViewHolder {

 private ImageView avatar;
 private TextView name;
 private TextView content;
 public TypeTwoViewHolder(View itemView) {
  super(itemView);

  avatar = (ImageView) itemView.findViewById(R.id.avatar);
  name = (TextView) itemView.findViewById(R.id.name);
  cOntent= (TextView) itemView.findViewById(R.id.content);
 }
 //ViewHolder数据和外面数据绑定起来
 @Override
 public void bindHolder(DataModel model) {
  avatar.setBackgroundResource(model.avatarColor);
  name.setText(model.name);
  content.setText(model.content);
 }
}

TypeThreeViewHolder.class

package com.example.tony.recyclerviewdemo;

import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Created by Tony on 2016/12/3.
 */

public class TypeThreeViewHolder extends TypeAbstractViewHolder {

 private ImageView avatar;
 private TextView name;
 private TextView content;
 private ImageView contentImage;
 public TypeThreeViewHolder(View itemView) {
  super(itemView);

  avatar = (ImageView) itemView.findViewById(R.id.avatar);
  cOntentImage= (ImageView) itemView.findViewById(R.id.contentImage);
  name = (TextView) itemView.findViewById(R.id.name);
  cOntent= (TextView) itemView.findViewById(R.id.content);
 }
 //ViewHolder数据和外面数据绑定起来
 @Override
 public void bindHolder(DataModel model) {
  avatar.setBackgroundResource(model.avatarColor);
  name.setText(model.name);
  contentImage.setBackgroundResource(model.contentColor);
  content.setText(model.content);
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文介绍了如何通过设置背景形状来轻松地为 Android 的 TextView 添加圆形边框。我们将详细讲解 XML 代码的配置,包括圆角、描边和填充等属性。 ... [详细]
  • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
  • 反向投影技术主要用于在大型输入图像中定位特定的小型模板图像。通过直方图对比,它能够识别出最匹配的区域或点,从而确定模板图像在输入图像中的位置。 ... [详细]
  • 解决Anaconda安装TensorFlow时遇到的TensorBoard版本问题
    本文介绍了在使用Anaconda安装TensorFlow时遇到的“Could not find a version that satisfies the requirement tensorboard”错误,并提供详细的解决方案,包括创建虚拟环境和配置PyCharm项目。 ... [详细]
  • 如何将本地Docker镜像推送到阿里云容器镜像服务
    本文详细介绍将本地Docker镜像上传至阿里云容器镜像服务的步骤,包括登录、查看镜像列表、推送镜像以及确认上传结果。通过本文,您将掌握如何高效地管理Docker镜像并将其存储在阿里云的镜像仓库中。 ... [详细]
  • 在创建新的Android项目时,您可能会遇到aapt错误,提示无法打开libstdc++.so.6共享对象文件。本文将探讨该问题的原因及解决方案。 ... [详细]
  • 查找最小值的操作是很简单的,只需要从根节点递归的遍历到左子树节点即可。当遍历到节点的左孩子为NULL时,则这个节点就是树的最小值。上面的树中,从根节点20开始,递归遍历左子 ... [详细]
  • 在使用STM32Cube进行定时器配置时,有时会遇到延时不准的问题。本文探讨了可能导致延时不准确的原因,并提供了解决方法和预防措施。 ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
  • 深入理解Lucene搜索机制
    本文旨在帮助读者全面掌握Lucene搜索的编写步骤、核心API及其应用。通过详细解析Lucene的基本查询和查询解析器的使用方法,结合架构图和代码示例,带领读者深入了解Lucene搜索的工作流程。 ... [详细]
  • DeepMind迁入谷歌伦敦新总部:人工智能研究的新里程碑
    谷歌旗下的人工智能研究机构DeepMind已正式入驻位于伦敦国王十字车站潘克拉斯广场6号的新总部。这座现代化的办公大楼不仅为DeepMind提供了宽敞的研究空间,也象征着谷歌对AI技术发展的高度重视。 ... [详细]
  • 在项目部署后,Node.js 进程可能会遇到不可预见的错误并崩溃。为了及时通知开发人员进行问题排查,我们可以利用 nodemailer 插件来发送邮件提醒。本文将详细介绍如何配置和使用 nodemailer 实现这一功能。 ... [详细]
  • 本文将探讨Java编程语言中对象和类的核心概念,帮助读者更好地理解和应用面向对象编程的思想。通过实际例子和代码演示,我们将揭示如何在Java中定义、创建和使用对象。 ... [详细]
  • 本文详细探讨了JavaScript中的作用域链和闭包机制,解释了它们的工作原理及其在实际编程中的应用。通过具体的代码示例,帮助读者更好地理解和掌握这些概念。 ... [详细]
  • 本文详细介绍了如何在 Android 开发中高效地管理和使用资源,包括本地资源和系统资源的访问方法。通过实例和代码片段,帮助开发者更好地理解和应用资源管理的最佳实践。 ... [详细]
author-avatar
Florence珠宝定制
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有