iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android RecyclerView加载不同布局简单实现
  • 179
分享到

Android RecyclerView加载不同布局简单实现

布局recyclerviewAndroid 2022-06-06 07:06:07 179人浏览 薄情痞子
摘要

前言 关于RecyclerView的使用这里就不在赘述了,相信网上一搜一大把(本人之前的文章也有简单的使用介绍),这次我们讲的是RecyclerView在使用的过程中,有时候会

前言

关于RecyclerView的使用这里就不在赘述了,相信网上一搜一大把(本人之前的文章也有简单的使用介绍),这次我们讲的是RecyclerView在使用的过程中,有时候会根据不同的位置加载不同的布局的简单实现,这里只是起到抛砖引玉的作用

效果图

设计思想
 •重写RecyclerView.Adapter的getItemViewType(int position),
在此方法中根据不同的position,设置不同的ViewType
 •编写具体的RecyclerView.ViewHolder子类(不同子类对应不同View或Layout)
 •重写RecyclerView.Adapter的onCreateViewHolder(ViewGroup parent,int viewType)
在此方法中根据我们之前设置的ViewType来返回不同的RecyclerView.ViewHolder的子类 

代码

使用RecyclerView需要添加依赖

compile 'com.Android.support:recyclerview-v7:24.1.1'

首先是MainActivity布局,很简单的布局


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="Http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context="com.example.hfs.recyclerviewloadlayout.MainActivity">
  <android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerview"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
</RelativeLayout>

然后是MainActivity代码


package com.example.hfs.recyclerviewloadlayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
  private RecyclerView mRecyclerView;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
    initData();
  }
  private void initData() {
    List<String> descs = new ArrayList<>();
    descs.clear();
    List<Integer> images = new ArrayList<>();
    images.clear();
    for (int i = 1; i < 21; i++) {
      descs.add("测试数据" + (i < 10 ? "0" + i : i));
    }
    images.add(R.mipmap.ic_launcher);
    images.add(R.mipmap.ic_launcher);
    images.add(R.mipmap.ic_launcher);
    images.add(R.mipmap.ic_launcher);
    images.add(R.mipmap.ic_launcher);
    images.add(R.mipmap.ic_launcher);
    images.add(R.mipmap.ic_launcher);
    images.add(R.mipmap.ic_launcher);
    images.add(R.mipmap.ic_launcher);
    images.add(R.mipmap.ic_launcher);
    images.add(R.mipmap.ic_launcher);
    images.add(R.mipmap.ic_launcher);
    images.add(R.mipmap.ic_launcher);
    images.add(R.mipmap.ic_launcher);
    images.add(R.mipmap.ic_launcher);
    images.add(R.mipmap.ic_launcher);
    images.add(R.mipmap.ic_launcher);
    images.add(R.mipmap.ic_launcher);
    images.add(R.mipmap.ic_launcher);
    images.add(R.mipmap.ic_launcher);
    images.add(R.mipmap.ic_launcher);
    MyAdapter adapter = new MyAdapter(MainActivity.this, descs, images);
    mRecyclerView.setAdapter(adapter);
    RecyclerView.LayoutManager manager = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false);
    mRecyclerView.setLayoutManager(manager);
    mRecyclerView.addItemDecoration(new DividerItemDecoration(MainActivity.this, DividerItemDecoration.VERTICAL_LIST));
    adapter.setmOnItemClickListener(new MyAdapter.OnItemClickListener() {
      @Override
      public void onItemClick(View view, int position) {
        Toast.makeText(MainActivity.this, "点击了" + position + "位置", Toast.LENGTH_SHORT).show();
      }
    });
  }
  private void initView() {
    mRecyclerView= (RecyclerView) findViewById(R.id.recyclerview);
  }
}

然后是我们的适配器


package com.example.hfs.recyclerviewloadlayout;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
  private Context mContext;
  private List<String> descs;
  private List<Integer> images;
  private List<Object> allList;
  private static final int TEXTVIEW_VIEWTYPE = 1;
  private static final int IMAGEVIEW_VIEWTYPE = 2;
  public interface OnItemClickListener {
    void onItemClick(View view, int position);
  }
  private OnItemClickListener mOnItemClickListener;
  public OnItemClickListener getmOnItemClickListener() {
    return mOnItemClickListener;
  }
  public void setmOnItemClickListener(OnItemClickListener mOnItemClickListener) {
    this.mOnItemClickListener = mOnItemClickListener;
  }
  public MyAdapter(Context mContext, List<String> descs, List<Integer> images) {
    this.mContext = mContext;
    this.descs = descs;
    this.images = images;
    allList = new ArrayList<>();
    allList.clear();
    for (int i = 0; i < descs.size(); i++) {
      allList.add(descs.get(i));
      allList.add(images.get(i));
    }
  }
  @Override
  public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    RecyclerView.ViewHolder holder = getViewHolderByViewType(viewType);
    return holder;
  }
  private RecyclerView.ViewHolder getViewHolderByViewType(int viewType) {
    View tv_ItemView = View.inflate(mContext, R.layout.item_tv, null);
    View iv_ItemView = View.inflate(mContext, R.layout.item_iv, null);
    RecyclerView.ViewHolder holder = null;
    switch (viewType) {
      case TEXTVIEW_VIEWTYPE:
        holder = new MyTextView_ViewHolder(tv_ItemView);
        break;
      case IMAGEVIEW_VIEWTYPE:
        holder = new MyImageView_ViewHolder(iv_ItemView);
        break;
    }
    return holder;
  }
  @Override
  public int getItemViewType(int position) {
    int viewType = -1;
    int index = position % 2;
    switch (index) {
      case 0:
        viewType = TEXTVIEW_VIEWTYPE;
        break;
      case 1:
        viewType = IMAGEVIEW_VIEWTYPE;
        break;
    }
    return viewType;
  }
  @Override
  public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
    if (position % 2 == 0) {
      ((MyTextView_ViewHolder) holder).tv.setText(((String) allList.get(position)));
      ((MyTextView_ViewHolder) holder).view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          if (mOnItemClickListener != null) {
            mOnItemClickListener.onItemClick(v, position);
          }
        }
      });
    } else {
      ((MyImageView_ViewHolder) holder).iv.setImageResource(((Integer) allList.get(position)));
      ((MyImageView_ViewHolder) holder).view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          if (mOnItemClickListener != null) {
            mOnItemClickListener.onItemClick(v, position);
          }
        }
      });
    }
  }
  @Override
  public int getItemCount() {
    return allList.size();
  }
  class MyTextView_ViewHolder extends RecyclerView.ViewHolder {
    public View view;
    public TextView tv;
    public MyTextView_ViewHolder(View itemView) {
      super(itemView);
      this.view = itemView;
      this.tv = (TextView) itemView.findViewById(R.id.tv);
    }
  }
  class MyImageView_ViewHolder extends RecyclerView.ViewHolder {
    public View view;
    public ImageView iv;
    public MyImageView_ViewHolder(View itemView) {
      super(itemView);
      this.view = itemView;
      this.iv = (ImageView) itemView.findViewById(R.id.iv);
    }
  }
}

接着就是我们自定义的DividerItemDecoration


package com.example.hfs.recyclerviewloadlayout;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;

public class DividerItemDecoration extends RecyclerView.ItemDecoration {
  private static final int[] ATTRS = new int[]{
      android.R.attr.listDivider
  };
  public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
  public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
  private Drawable mDivider;
  private int mOrientation;
  public DividerItemDecoration(Context context, int orientation) {
    final TypedArray a = context.obtainStyledAttributes(ATTRS);
    mDivider = a.getDrawable(0);
    a.recycle();
    setOrientation(orientation);
  }
  public void setOrientation(int orientation) {
    if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
      throw new IllegalArgumentException("invalid orientation");
    }
    mOrientation = orientation;
  }
  @Override
  public void onDraw(Canvas c, RecyclerView parent) {
    if (mOrientation == VERTICAL_LIST) {
      drawVertical(c, parent);
    } else {
      drawHorizontal(c, parent);
    }
  }
  public void drawVertical(Canvas c, RecyclerView parent) {
    final int left = parent.getPaddingLeft();
    final int right = parent.getWidth() - parent.getPaddingRight();
    final int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
      final View child = parent.getChildAt(i);
      RecyclerView v = new RecyclerView(parent.getContext());
      final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
          .getLayoutParams();
      final int top = child.getBottom() + params.bottomMargin;
      final int bottom = top + mDivider.getIntrinsicHeight();
      mDivider.setBounds(left, top, right, bottom);
      mDivider.draw(c);
    }
  }
  public void drawHorizontal(Canvas c, RecyclerView parent) {
    final int top = parent.getPaddingTop();
    final int bottom = parent.getHeight() - parent.getPaddingBottom();
    final int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
      final View child = parent.getChildAt(i);
      final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
          .getLayoutParams();
      final int left = child.getRight() + params.rightMargin;
      final int right = left + mDivider.getIntrinsicHeight();
      mDivider.setBounds(left, top, right, bottom);
      mDivider.draw(c);
    }
  }
  @Override
  public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
    if (mOrientation == VERTICAL_LIST) {
      outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
    } else {
      outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
    }
  }
}

项目地址:https://GitHub.com/Greathfs/RecyclerViewLoadLayout

您可能感兴趣的文章:Android RecyclerView点击事件Android RecyclerView的Item点击事件实现整理Android使用RecyclerView实现自定义列表、点击事件以及下拉刷新RecyclerView的使用之多种Item加载布局Android中RecyclerView布局代替GridView实现类似支付宝的界面Android RecyclerView网格布局(支持多种分割线)详解(2)Android RecyclerView布局就这么简单Android开发中RecyclerView模仿探探左右滑动布局功能Android 中RecyclerView多种item布局的写法(头布局+脚布局)Recyclerview添加头布局和尾布局、item点击事件详解


--结束END--

本文标题: Android RecyclerView加载不同布局简单实现

本文链接: https://www.lsjlt.com/news/24160.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android 手写RecyclerView实现列表加载
    目录前言1 RecyclerView的加载流程2 自定义RecyclerView2.1 RecyclerView三板斧2.2 初始化工作2.3 ItemView的获取与摆放2.4 复...
    99+
    2024-04-02
  • Android实现简单的加载进度条
    本文实例为大家分享了Android实现简单的加载进度条的具体代码,供大家参考,具体内容如下 1.效果图 2.自定义progressBar package com.example...
    99+
    2024-04-02
  • Android中RecyclerView实现简单购物车功能
    Android中RecyclerView实现简单的购物车,供大家参考,具体内容如下 我们知道在ListView中用setTag来解决Item的复用问题,但是RecyclerView中...
    99+
    2024-04-02
  • JQuery实现简单瀑布流布局
    本文实例为大家分享了JQuery实现简单瀑布流布局的具体代码,供大家参考,具体内容如下 分享一个基于JQuery实现的瀑布流布局,效果如下:  实现代码如下,欢迎大家复制...
    99+
    2024-04-02
  • Android实现简单的自定义ViewGroup流式布局
    目录前言一、基本的测量与布局二、流式的布局的layout三、流式的布局的Measure后记前言 前面几篇我们简单的复习了一下自定义 View 的测量与绘制,并且回顾了常见的一些事件的...
    99+
    2022-12-09
    Android自定义ViewGroup流式布局 Android ViewGroup流式布局 Android ViewGroup 布局
  • Android实现RecyclerView嵌套流式布局的详细过程
    目录前言实现过程效果总结前言 Android开发中,列表页面是常见需求,流式布局的标签效果也是常见需求,那么两者结合的效果啥样呢?这篇文章简单实现一下。 实现过程 添加流式布局依赖,...
    99+
    2022-12-24
    android recyclerview嵌套流式布局 android recyclerview多布局 RecyclerView嵌套
  • Android如何实现简单的加载进度条
    这篇文章将为大家详细讲解有关Android如何实现简单的加载进度条,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系统,主要...
    99+
    2023-06-14
  • js实现瀑布流布局(无限加载)
    本文实例为大家分享了js实现瀑布流布局的具体代码,供大家参考,具体内容如下 1.实现瀑布流布局思路 准备好数据之后 . 绑定滚动事件 . 判断页面是否到底(滚动的距离+可是区域的高度...
    99+
    2024-04-02
  • Android简单实现文件下载
    本文实例为大家分享了Android简单实现文件下载的具体代码,供大家参考,具体内容如下 权限 <!-- 文件读写权限 --> <uses-permissio...
    99+
    2024-04-02
  • Android中如何使用RecyclerView实现简单购物车功能
    这篇文章给大家分享的是有关Android中如何使用RecyclerView实现简单购物车功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下我们知道在ListView中用setTag来解决Item的复用...
    99+
    2023-06-29
  • 如何在Android中利用Recyclerview实现一个上拉加载功能
    如何在Android中利用Recyclerview实现一个上拉加载功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在项目中使用列表的下拉刷新和上拉加载更多是很常见的功能,下拉...
    99+
    2023-05-31
    android recyclerview recycle
  • Android如何实现双重单选对话框布局
    这篇文章将为大家详细讲解有关Android如何实现双重单选对话框布局,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:首先是自定义XML布局代码:<xml version="...
    99+
    2023-05-30
    android
  • 在Android开发中使用Toast怎么实现自定义布局简单示例
    在Android开发中使用Toast怎么实现自定义布局简单示例?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先加载一个自定义的布局LayoutInflater...
    99+
    2023-05-31
    android toast roi
  • Android中怎么实现底图局部加载移动
    今天就跟大家聊聊有关Android中怎么实现底图局部加载移动,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。具体如下:public class MapMgr&nbs...
    99+
    2023-05-30
    android
  • CSS Positions布局实现网页加载动画的技巧
    在当今互联网时代,网页设计越来越注重用户体验,其中网页加载动画是吸引用户注意力的重要元素之一。而CSS Positions布局是一种常用的网页布局方式,通过合理运用它,可以实现网页加载动画的效果。本文将介绍如何利用CSS Positions...
    99+
    2023-10-21
    技巧 布局 CSS Positions 网页加载动画
  • CSS+JavaScript怎么实现页面不同布局的切换
    这篇文章主要介绍“CSS+JavaScript怎么实现页面不同布局的切换”,在日常操作中,相信很多人在CSS+JavaScript怎么实现页面不同布局的切换问题上存在疑惑,小编查阅了各式资料,整理出简单好用...
    99+
    2024-04-02
  • CSS3如何实现瀑布流布局与无限加载图片相册
    这篇文章主要介绍了CSS3如何实现瀑布流布局与无限加载图片相册,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、pic1.html页面代码如...
    99+
    2024-04-02
  • 在Android项目中使用RecyclerView实现一个上拉加载更多功能
    在Android项目中使用RecyclerView实现一个上拉加载更多功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。既然有刷新的时候有两种状态就要定义两个状...
    99+
    2023-05-31
    android recyclerview recycle
  • 如何使用HTML和CSS实现一个简单的居中布局
    在网页设计中,居中布局是十分常见的一种布局方式。通过使用HTML和CSS,我们可以很容易地实现一个简单而美观的居中布局。在开始之前,我们需要建立一个基本的HTML结构。首先,我们创建一个包含内容的dc6dce4a544fdca2df29d5...
    99+
    2023-10-21
    CSS html 居中布局
  • vue项目实现图片懒加载的简单步骤
    目录1、安装vue-lazyload插件2、在main.js中进行引用3、使用(将图片设置为懒加载)总结1、安装vue-lazyload插件 npm install vue-lazy...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作