您的位置:首页 > 其它

优雅的使用RecyclerView(在一个recyclerView里显示有不同子布局的界面,就是混合不同布局)

2016-10-29 17:30 555 查看
原文

一:为了使用RecyclerView,首先在build.gradle(Module:app)文件里:

加入:

dependencies {compile 'com.android.support:recyclerview-v7:24.0.0'
}


二:主要代码

package com.example.kirito.testrecyclerview;

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

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

public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private DemoAdapter adpter;

private int colors[] = {android.R.color.holo_blue_bright,android.R.color.black,android.R.color.holo_red_dark};
private static final String TAG = "MainActivity";

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

recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
//必须设置layoutmanager,否则无法正常加载
recyclerView.setLayoutManager(new LinearLayoutManager(this,
LinearLayoutManager.VERTICAL,false));
adpter = new DemoAdapter(this);
recyclerView.setAdapter(adpter);
initData();
}

private void initData() {
List<Item> items = new ArrayList<>();
for (int i = 0; i < 20; i++) {
Item item = new Item();
//产生1-3的随机数
int type = (int) (Math.random() * 3 + 1);
//Log.e(TAG, "initData: random---"+ (int) (Math.random() * 3 + 1));
item.type = type;
item.avaterColor = colors[type - 1];
item.content = "content:" + i;
item.contentColor = colors[type - 1];
item.name = "name:" + i;
items.add(item);
}
adpter.addList(items);
//即使不要下面这句也能正常初始化recyclerview
adpter.notifyDataSetChanged();
}

}

package com.example.kirito.testrecyclerview;

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

/**
* Created by kirito on 2016.10.29.
*/

public abstract class TypeAbstarctViewHolder extends RecyclerView.ViewHolder {
public TypeAbstarctViewHolder(View itemView) {
super(itemView);
}

public abstract void bindHolder(Item item);
}

package com.example.kirito.testrecyclerview;

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

/**
* Created by kirito on 2016.10.29.
*/

public class TypeOneHolder extends TypeAbstarctViewHolder {
private ImageView avater;
private TextView name;

public TypeOneHolder(View itemView) {
super(itemView);
avater = (ImageView) itemView.findViewById(R.id.avater);
name = (TextView) itemView.findViewById(R.id.name);
}

//为ViewHolder绑定数据
@Override
public void bindHolder(Item item) {
avater.setBackgroundResource(item.avaterColor);
name.setText(item.name);
}
}

package com.example.kirito.testrecyclerview;

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

/**
* Created by kirito on 2016.10.29.
*/

public class TypeTwoHolder extends TypeAbstarctViewHolder {
private ImageView avater;
private TextView name;
private TextView content;

public TypeTwoHolder(View itemView) {
super(itemView);
avater = (ImageView) itemView.findViewById(R.id.avater);
name = (TextView) itemView.findViewById(R.id.name);
content = (TextView) itemView.findViewById(R.id.content);
}

@Override
public void bindHolder(Item item) {
avater.setBackgroundResource(item.avaterColor);
name.setText(item.name);
content.setText(item.content);
}
}

package com.example.kirito.testrecyclerview;

import android.view.View;
import android.wid
f184
get.ImageView;
import android.widget.TextView;

/**
* Created by kirito on 2016.10.29.
*/

public class TypeThreeHolder extends TypeAbstarctViewHolder {
private ImageView avater;
private TextView name;
private TextView content;
private ImageView iv;

public TypeThreeHolder(View itemView) {
super(itemView);
avater = (ImageView) itemView.findViewById(R.id.avater);
name = (TextView) itemView.findViewById(R.id.name);
content = (TextView) itemView.findViewById(R.id.content);
iv = (ImageView) itemView.findViewById(R.id.content_color);
}

@Override
public void bindHolder(Item item) {
avater.setBackgroundResource(item.avaterColor);
name.setText(item.name);
content.setText(item.content);
iv.setBackgroundResource(item.contentColor);
}
}

package com.example.kirito.testrecyclerview;

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 kirito on 2016.10.29.
*/

public class DemoAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<Item> itemList = new ArrayList<>();
private LayoutInflater mLayoutInflater;

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

//使用此方法从mainactivity获取数据,这样就不用从构造方法里传数据了
public void addList(List<Item> items){
itemList.addAll(items);
}

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

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//根据不同的viewType,创建并返回相应的ViewHolder
switch (viewType){
case Item.TYPE_ONE:
return new TypeOneHolder(mLayoutInflater.inflate(R.layout.item_type_one,parent,false));
case Item.TYPE_TWO:
return new TypeTwoHolder(mLayoutInflater.inflate(R.layout.item_type_two,parent,false));
case Item.TYPE_THREE:
return new TypeThreeHolder(mLayoutInflater.inflate(R.layout.item_type_three,parent,false));
}
return null;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
//因为抽象出了TypeAbstarctViewHolder,所以这里可以减少代码量
((TypeAbstarctViewHolder)holder).bindHolder(itemList.get(position));
}

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

package com.example.kirito.testrecyclerview;

/**
* Created by kirito on 2016.10.29.
*/

public class Item {
protected static final int TYPE_ONE = 1;
protected static final int TYPE_TWO = 2;
protected static final int TYPE_THREE = 3;

protected int type;
protected int avaterColor;
protected int contentColor;
protected String name;
protected String content;

public String getContent() {
return content;
}

public void setContent(String content) {
this.content = content;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getContentColor() {
return contentColor;
}

public void setContentColor(int contentColor) {
this.contentColor = contentColor;
}

public int getAvaterColor() {
return avaterColor;
}

public void setAvaterColor(int avaterColor) {
this.avaterColor = avaterColor;
}

public int getType() {
return type;
}

public void setType(int type) {
this.type = type;
}

public static int getTypeThree() {
return TYPE_THREE;
}

public static int getTypeTwo() {
return TYPE_TWO;
}

public static int getTypeOne() {
return TYPE_ONE;
}
}

布局文件代码就省略了...

运行效果:



三:混合Grid布局

主要修改了MainActivity里的代码,如下

package com.example.kirito.testrecyclerview;

import android.graphics.Rect;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;

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

public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private DemoAdapter adpter;

private int colors[] = {android.R.color.holo_blue_bright,android.R.color.black,android.R.color.holo_red_dark};
private static final String TAG = "MainActivity";

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

recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
//gridlayoutmanager构造参数里的2,指的是一行有几列
final GridLayoutManager manager = new GridLayoutManager(this,2);
//必须设置layoutmanager,否则无法正常加载
recyclerView.setLayoutManager(manager);
adpter = new DemoAdapter(this);
recyclerView.setAdapter(adpter);
//设置占用的列数
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
int type = recyclerView.getAdapter().getItemViewType(position);
//若是TYPE_THREE,占用两列,否则占用一列
if (type == Item.TYPE_THREE){
return manager.getSpanCount();
}else {
return 1;
}
}
});
recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
//给布局里的子view添加边距
GridLayoutManager.LayoutParams layoutParams = (GridLayoutManager.LayoutParams) view.getLayoutParams();
int spanSize = layoutParams.getSpanSize();
int spanIndex = layoutParams.getSpanIndex();
outRect.top = 20;
if (spanSize != manager.getSpanCount()){
if (spanIndex == 0){
outRect.right = 10;
}else {
outRect.left = 10;
}
}
}
});
initData();
}

private void initData() {
List<Item> items = new ArrayList<>();
for (int i = 0; i < 20; i++) {
Item item = new Item();
//产生1-3的随机数
int type = (int) (Math.random() * 3 + 1);
//Log.e(TAG, "initData: random---"+ (int) (Math.random() * 3 + 1));
item.type = type;
item.avaterColor = colors[type - 1];
item.content = "content:" + type;
item.contentColor = colors[type - 1];
item.name = "name:" + type;
items.add(item);
}
adpter.addList(items);
//即使不要下面这句也能正常初始化recyclerview
adpter.notifyDataSetChanged();
}

}

效果图:

完整的代码:github
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐