您的位置:首页 > 其它

整合大量开源库项目(七)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

记得点个赞哦!

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