Android RecyclerView加載不同布局簡單實(shí)現(xiàn)
前言
關(guān)于RecyclerView的使用這里就不在贅述了,相信網(wǎng)上一搜一大把(本人之前的文章也有簡單的使用介紹),這次我們講的是RecyclerView在使用的過程中,有時候會根據(jù)不同的位置加載不同的布局的簡單實(shí)現(xiàn),這里只是起到拋磚引玉的作用
效果圖

設(shè)計(jì)思想
•重寫RecyclerView.Adapter的getItemViewType(int position),
在此方法中根據(jù)不同的position,設(shè)置不同的ViewType
•編寫具體的RecyclerView.ViewHolder子類(不同子類對應(yīng)不同View或Layout)
•重寫RecyclerView.Adapter的onCreateViewHolder(ViewGroup parent,int viewType)
在此方法中根據(jù)我們之前設(shè)置的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("測試數(shù)據(jù)" + (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, "點(diǎn)擊了" + 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);
}
}
}
項(xiàng)目地址:https://github.com/Greathfs/RecyclerViewLoadLayout
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android RecyclerView實(shí)現(xiàn)多種item布局的方法
- Android RecyclerView顯示Item布局不一致解決辦法
- Android開發(fā)中RecyclerView模仿探探左右滑動布局功能
- Android RecyclerView布局就這么簡單
- Android RecyclerView加載兩種布局的方法
- Android RecyclerView網(wǎng)格布局示例解析
- Android列表RecyclerView排列布局
- Android RecyclerView多類型布局卡片解決方案
- Android實(shí)現(xiàn)RecyclerView嵌套流式布局的詳細(xì)過程
相關(guān)文章
Android viewpage實(shí)現(xiàn)可控制的禁止滑動
這篇文章主要為大家詳細(xì)介紹了Android viewpage實(shí)現(xiàn)可控制的禁止滑動,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11
Android 簡單的照相機(jī)程序的實(shí)例代碼
終于經(jīng)過多次找錯,修改把一個簡單的照相機(jī)程序完成了,照相類代碼如下:2013-05-05
Android實(shí)現(xiàn)excel/pdf/word/odt/圖片相互轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了Android如何實(shí)現(xiàn)excel/pdf/word/odt/圖片之間的相互轉(zhuǎn)換,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-04-04
Android Studio中使用jni進(jìn)行opencv開發(fā)的環(huán)境配置方法
今天小編就為大家分享一篇Android Studio中使用jni進(jìn)行opencv開發(fā)的環(huán)境配置方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
Flutter實(shí)現(xiàn)頁面路由及404路由攔截
這篇文章介紹了Flutter實(shí)現(xiàn)頁面路由及404路由攔截的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2021-11-11
Android開發(fā)獲取短信的內(nèi)容并截取短信
本文給大家介紹android開發(fā)獲取短信內(nèi)容并截取短息的相關(guān)內(nèi)容,本文代碼簡單易懂,感興趣的朋友一起學(xué)習(xí)吧2015-12-12
Android 多線程的實(shí)現(xiàn)方法總結(jié)
這篇文章主要介紹了Android 多線程的實(shí)現(xiàn)方法總結(jié)的相關(guān)資料,這里提供三種方法,幫助大家掌握這部分內(nèi)容,需要的朋友可以參考下2017-08-08
Android長按imageview把圖片保存到本地的實(shí)例代碼
本文通過代碼給大家介紹了Android長按imageview把圖片保存到本地的實(shí)現(xiàn)方法,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-12-12

