前言
关于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布局,很简单的布局
然后是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 descs = new ArrayList<>();
descs.clear();
List 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{ private Context mContext; private List descs; private List images; private List
接着就是我们自定义的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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。



