整合大量开源库项目(七)ListView迁移成 RecyclerView
2015-12-16 11:16
435 查看
转载请注明出处:王亟亟的大牛之路
开场先介绍下为什么使用RecyclerView,以及一些简单的理论知识Q:为什么使用RecyclerView?
A: 一个非常灵活的用于在有限的窗口范围内显示大量数据的控件。
Q:使用RecyclerView的好处是什么?
A:提供了一种插拔式的体验,高度的解耦,异常的灵活
Q:RecyclerView可以实现什么?
A:ListView、GridView、瀑布效果等等等,并且性能优异!
OK,理论知识大致的介绍到这里,更多内容我们在代码中实现。
上一篇文章,我们是用一个CodeAdapter extends BaseAdapter来实现我们的适配器,而RecyclerView是另一种不同的实现,代码如下。
public class CodeActivity extends Son { private RecyclerView mRecyclerView; private RecyclerView.LayoutManager mLayoutManager; private CodeAdapter adapter; ToastUtils toastUtils; LogicJumpTo logicJumpTo; @Override public int getLayout() { LogUtils.d("--->CodeActivity getLayout"); return R.layout.activity_code; } @Override public void init() { toastUtils = ToastUtils.getInstance(); logicJumpTo = LogicJumpTo.getInstance(); //创建默认的线性LayoutManager mLayoutManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(mLayoutManager); //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能 mRecyclerView.setHasFixedSize(true); adapter = new CodeAdapter(getResources().getStringArray(R.array.codeArray)); mRecyclerView.setAdapter(adapter); adapter.setOnItemClickListener(new CodeAdapter.OnRecyclerViewItemClickListener() { @Override public void onItemClick(View view, String data) { toastUtils.show(CodeActivity.this, data, false); switch (data) { case "For EditText": logicJumpTo.noValueJump(CodeActivity.this, EditTextActivity.class); break; case "For TextView": break; case "For Button/CheckBox/Switch/ProgressBar/Spinner": break; case "For ListView/GridView/TabHost": break; case "For Dialog": break; case "For CustomView": break; case "For ImageView": break; case "For WebView": break; case "For Animation": break; case "For Layout": break; case "For Menu": break; case "For NetWork": break; case "Others": break; } } }); } @Override public void bindID() { ActionBar actionBar = getActionBar(); actionBar.setTitle("个人开发"); actionBar.setDisplayHomeAsUpEnabled(true); mRecyclerView = (RecyclerView) findViewById(R.id.codeListView); } @Override public void setOnclick() { } @Override public void logic() { LogUtils.d("--->CodeActivity logic"); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; } return super.onOptionsItemSelected(item); } public static class CodeAdapter extends RecyclerView.Adapter<CodeAdapter.ViewHolder> implements OnClickListener{ public String[] datas = null; public CodeAdapter(String[] datas) { this.datas = datas; } public static interface OnRecyclerViewItemClickListener { void onItemClick(View view, String data); } private OnRecyclerViewItemClickListener mOnItemClickListener = null; public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { this.mOnItemClickListener = listener; } //创建新View,被LayoutManager所调用 @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.code_listview_item, viewGroup, false); ViewHolder vh = new ViewHolder(view); //将创建的View注册点击事件 view.setOnClickListener(this); return vh; } //将数据与界面进行绑定的操作 @Override public void onBindViewHolder(ViewHolder viewHolder, int position) { viewHolder.mTextView.setText(datas[position]); //将数据保存在itemView的Tag中,以便点击时进行获取 viewHolder.itemView.setTag(datas[position]); } //获取数据的数量 @Override public int getItemCount() { return datas.length; } @Override public void onClick(View v) { if (mOnItemClickListener != null) { //注意这里使用getTag方法获取数据 mOnItemClickListener.onItemClick(v,(String)v.getTag()); } } //自定义的ViewHolder,持有每个Item的的所有界面元素 public class ViewHolder extends RecyclerView.ViewHolder { public TextView mTextView; public ViewHolder(View view) { super(view); mTextView = (TextView) view.findViewById(R.id.codeText); } } } }
以上就是所有的Java代码层面的内容,下面会一点点来解释。
首先,说明一下!
RecyclerView是没有本身写好的 OnItemClickListener ()这样的回调的,得自己写!!
Item之间的间距啊,差异性什么的都可以存在,但是要用ItemDecoration 自己写!!
要让他变成ListView,GridView需要用LayoutManager这里倒不用自己写了!!
布局跟ListView类似,而且我们之前的ListView的动画也能沿用至此
<android.support.v7.widget.RecyclerView android:id="@+id/codeListView" android:layout_width="match_parent" android:layout_height="match_parent" android:choiceMode="singleChoice" android:scrollbars="none" android:layoutAnimation="@anim/code_item_anim" />
findViewById啊设置什么的都不多说,主要 点一下CodeAdapter 这一部分。
跟ListView一样,需要设置RecyclerView的Adapter,但是这里的Adapter跟ListView使用的Adapter不一样,这里的Adapter需要继承RecyclerView.Adapter,需要实现3个方法:
- onCreateViewHolder()
- onBindViewHolder()
- getItemCount()
之前的一些ArrayAdapter,BaseAdapter的就不要在这里使用了,统一使用RecyclerView.Adapter。
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)
这个方法主要生成为每个Item inflater出一个View,但是该方法返回的是一个ViewHolder。方法是把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例,当然这个ViewHolder需要我们自己去编写。直接省去了当初的convertView.setTag(holder)和convertView.getTag()这些繁琐的步骤。
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i)
这个方法主要用于适配渲染数据到View中。方法提供给你了一个viewHolder,而不是原来的convertView。
然后就是我们的点击实现,首先这边我们创建一个借口,然后去实现这个接口。再在我们的主Activity中去setOnItemClickListener,使之成为有效的回路,来完成我们的业务逻辑。
源码地址:https://github.com/ddwhan0123/SoyiGit
事例APK:https://github.com/ddwhan0123/SoyiGit/blob/master/Soyi/Soyi.apk
记得点个赞哦!
相关文章推荐
- Eclipse打包.jar文件(类库)
- PY++ 自动将你的C++程序接口封装供python调用
- Android LayoutInflater详解
- 关于ViewPagerIndicator开源项目的一些问题
- jenkins+soanrqube+svn+maven搭建,实现持续集成
- Angular 2今天终于更新代码到beta版本啦!
- android 里面对图片的不同压缩处理 以及简单拍照功能实现加设置闪光灯效果
- SVN更新失败导致SVN被锁定
- Cocos2d-x 常见细节问题总结 1
- 手机充电原理分析及问题总结
- 150分钟学会R语言与R常见问题解答
- Android studio项目发布到Maven中央库
- Win下如何查看本地计算机的网络端口被哪个应用程序所占用
- iOS 一个app跳转另一个app并实现通信(如A跳到B并打开B中指定页面)
- MD5加密
- 【转】Android点击空白区域,隐藏输入法软键盘
- vwampserver2.5-apache2.4.9允许外部访问的配置
- a标签的onclick和href事件的区别
- Python 定值类
- 《GK101任意波发生器》升级固件发布(版本:1.0.2build955)