优雅的使用RecyclerView(在一个recyclerView里显示有不同子布局的界面,就是混合不同布局)
2016-10-29 17:30
555 查看
原文
一:为了使用RecyclerView,首先在build.gradle(Module:app)文件里:
加入:
布局文件代码就省略了...
效果图:
一:为了使用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
相关文章推荐
- Recyclerview的一些个人理解与使用(二)实现一个简单的列表界面
- 如何用数据驱动实现通用化巡检APP(如何一个界面里添加多个点击拍照按钮并显示在不同的imageview里)
- 使用 recyclerView 布局显示不合理的问题
- 使用ListView进行不同布局ItemView的显示
- 一个ListView根据标识加载不同布局,很简单的例子,就是聊天界面,你说话在右边好友在左边怎么实现呢.
- Android中使用一个textview实现不同颜色以及内容分割的显示
- Android RecyclerView显示不同item布局
- android:RecyclerView布局管理显示不同跨度和空布局
- 使用RecyclerView实现两种不同Item布局
- 一个View中通过判断显示不同的layout布局
- 在RecyclerView的子布局中使用EditText,在第一项输入数据滚动出可视界面后,再次回到第一项后,输入的数据没有了
- 使用RecyclerView结合jiaozivideoplayer去加载不同类型的布局
- Android Studio 使用RecyclerView加载不同样式布局
- RecyclerView的进阶使用,一个LayoutManger下添加多种布局
- 安卓 相机或相册图片上传至手机界面并显示 最后上传至服务器(界面xml布局代码前一个文章有)
- IOS布局笔记三(使用不同父类的 view 进行约束)
- 【MFC】使用不同字符集显示不同外观的界面
- 使用XIB自定义一个UIView,然后将这个view添加到controller的view 上(相当于所有界面都通过xib来实现)
- Extjs实现多个Grid使用同一个Store,但显示不同的内容
- yii 如何在一个控制器里给不同的action使用不同的布局