一:为了使用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.widget.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