注:
以下纯属个人主观意识
可能会存在很多错误 小白一只
如果你是个珍惜每分每秒或者想提高自己,那不要往下看啦会浪费时间滴!
主要核心内容借鉴了该博客,文章思路
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1118/2004.html
具体原理就不多描述网上资料都有 ,总之RecyclerView想比listview 进更为灵活。
RecyclerView 是Android5.0 v7 的扩展包 可以往下兼容
包名:android.support.v7.widget.RecyclerView
由于是扩展包需要自己添加(注册)
在build.gradle添加代码 帝国的网络结果很难说
试过手动添加,出现了很多奇怪的问题
最后升级了SDk轻松搞定
添加方法File - Project Structure - Dependencies - "+" - Library Dependency
布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v7.widget.RecyclerView android:id="@+id/RecyclerView" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>item 布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="100dp" android:layout_height="wrap_content"> <TextView android:id="@+id/fruit_text_item" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
MianActivity
private List<File> data=new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_recyclerview); RecyclerView recyclerView = (RecyclerView) findViewById(R.id.RecyclerView); // RecyclerView 区别于ListView 自身只进行管理,提供接口由其具体类实现 // 布局管理器有三种: // LinearLayoutManager 现行管理器,支持横向、纵向。 // GridLayoutManager 网格布局管理器 // StaggeredGridLayoutManager 瀑布就式布局管理器 LinearLayoutManager LayoutManager =new LinearLayoutManager(this); // LinearLayoutManager.HORIZONTAL 横向排列 LayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); recyclerView.setLayoutManager(LayoutManager); File file=new File("I need food"); data.add(file); What what = new What(data); recyclerView.setAdapter(what);
---Adapter 先完整代码 后面再分析
List<File> File 我指定需求的参数,可以是你需求的任何类型
RecycView.ViewHolder 是item的持有类
class WhatViewHolder extends RecyclerView.ViewHolder{ TextView textView; public WhatViewHolder(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.fruit_text_item); } } class What extends RecyclerView.Adapter<WhatViewHolder>{ List<File> list; public What(List<File> list){ this.list = list; } public WhatViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.fruit_item,parent,false); WhatViewHolder wHolder = new WhatViewHolder(view); return wHolder; } @Override public void onBindViewHolder(WhatViewHolder holder, int position) { holder.textView.setText(list.get(position).getName()); } @Override public int getItemCount() { return list.size(); } }
分析 WhtViewHolder可以设成静态内部类等等一些效率高的类型 这里为容易解就写成这样
/extends RecyclerView.ViewHolder 泛型指定 class WhatViewHolder extends RecyclerView.ViewHolder{ public WhatViewHolder(View itemView) { super(itemView); } } class What extends RecyclerView.Adapter<WhatViewHolder>{ // return null!而且返回参数就是传进来的WhatViewHolder // 在onCreate方法中这种表现很明显 // 就是需要我们把从泛型传入的WhatViewHolder进行初始化参数然后返回 @Override public WhatViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return null; } // 这里的WhatViewHolder holder,就是接收onCreate方法的返回参数 // 进行绑定 @Override public void onBindViewHolder(WhatViewHolder holder, int position) { } //这里不能忽略 需要提供具体item的数量 如果就return 0; (不显示或不处理) @Override public int getItemCount() { return 0; } }
--------------------------------------------------
RecyclerView 监听需要自己在Adapter中实现
优点:在adapter中实现监听,所以可以监听item中具体子控件,灵活(一个item展现图文情况下分开监听)
下面实现(修改背景颜色) 主是回调机制的应用
在adapter中添加一个接口 并提供外部访问方法 (这里结合上面代码直接添加到What类中即可)
接口
public static interface OnItemClickListener { void onItemClick(List<WhatViewHolder> adapterViewHolder , int itemId); }
外部访问方法
public OnItemClickListener onItemClickListener; public void setOnItemClickListener(OnItemClickListener onItemClickListener){ this.onItemClickListener = onItemClickListener; }注册监听 可以在很多地方实现比如OnBind方法里(这主要考虑)
List<WhatViewHolder> adapterViewHolder = new ArrayList(); @Override public WhatViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.fruit_item,parent,false); final WhatViewHolder wHolder = new WhatViewHolder(view); adapterViewHolder.add(wHolder); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int itemId = wHolder.getAdapterPosition(); //回调 onItemClickListener.onItemClick(adapterViewHolder,itemId ); } }); return wHolder; }MainActivity中添加*(呵~不严谨)
File file=new File("I need food0"); data.add(file); File file1=new File("I need food1"); data.add(file1); File file2=new File("I need food2"); data.add(file2); what.setOnItemClickListener(new What.OnItemClickListener() { @Override public void onItemClick(List<WhatViewHolder> adapterViewHolder, int itemId) { for (int i = 0;i<adapterViewHolder.size();i++){ adapterViewHolder.get(i).textView.setBackgroundColor(0xff888888); } adapterViewHolder.get(itemId).textView.setBackgroundColor(0xff0000ff); } });
--------------------
还有很多想到但没能写下去,其实就有点懵了。献丑了。