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

作者:Greathfs 时间:2022-07-15 16:57:09 

前言

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

效果图

Android 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;

/**
* Created by HFS on 2016/8/24.
*/
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;

/**
* Created by HFS on 2016/8/24.
*/
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,加载
0
投稿

猜你喜欢

  • 在WPF中动态加载XAML中的控件实例代码

    2023-06-23 12:27:30
  • SpringMVC 如何使用注解完成登录拦截

    2023-11-18 02:20:11
  • Kotlin编程基础语法编码规范

    2023-06-20 16:50:07
  • Android通过自定义ImageView控件实现图片的缩放和拖动的实现代码

    2022-03-02 22:52:08
  • Android框架组件Lifecycle的使用详解

    2022-08-01 08:48:59
  • Spring security权限配置与使用大全

    2022-03-05 15:37:21
  • Java 反射之私有字段和方法详细介绍

    2021-12-14 05:41:53
  • android时间选择控件之TimePickerView使用方法详解

    2023-01-14 02:58:12
  • Android App中实现可以双击放大和缩小图片功能的实例

    2023-04-01 16:41:17
  • HTTP中get和post的区别详解

    2023-04-19 11:42:18
  • Unity中 ShaderGraph 实现超级炫酷的溶解效果入门级教程

    2021-11-15 01:48:08
  • 详解netty中的frame解码器

    2022-02-22 14:40:21
  • 六款值得推荐的android(安卓)开源框架简介

    2023-06-24 01:46:54
  • Android 数据库文件存取至储存卡的方法

    2023-05-08 19:12:14
  • MyBatis中使用foreach循环的坑及解决

    2023-11-02 12:47:51
  • Android 中RecyclerView顶部刷新实现详解

    2022-08-20 17:22:39
  • Java多态的全面系统解析

    2023-06-22 13:39:22
  • 简单了解Java断言利器AssertJ原理及用法

    2022-07-12 15:54:21
  • java用applet画图用到的方法(涉及双缓冲)

    2021-07-09 17:27:32
  • 深入了解SparkSQL的运用及方法

    2023-06-08 13:43:27
  • asp之家 软件编程 m.aspxhome.com