一,高逼格的路途还很长,喜欢技术的都进来看看。如果我写博客的对你没有用而且你觉得我这文章没逼格,我会努力让以后文章更有内涵更有逼格的。
RecyclerView的特点:
1,谷歌在高版本提出一个新的代替ListView,GridView的控件。那就是
高逼格RecyclerView.
2,给RecyclerView设置布局管理器就可以实现GridView和ListView以及
瀑布流等效果。不得不说高度解耦谷歌做的确实很棒。
3.自带了性能优化。ViewHolder。
RecyclerView缺点:
1.使用过RecyclerView的同学也知道他并没有提供 像ListView和
GridView…的setOnItemClickListener和setOnLongClickListener事
件。
2.RecyclerView谷歌工程师并没有提供分割线,在ListView里面我们可
以设置分割线通过setDivide设置(好像是),你们自己试试,有点忘
记了。一会儿敲代码试试好像是这个方 法。不知道谷歌工程师则么想
的。烦死了。当然我相信很多小伙伴们都会说我们只需要在item布局
里面设置一个View来占位。在小公司也许就你一个人担任着android开
发,也许行得通,但是在大公司你这个会被笑死的。对于一个View在
布局里面每次从新绘制,在性能方面是不可取的。
二,我们来一一解决RecyclerView的缺点:
1)来设置点击事件和长按事件:
一般的RecyclerView的数据展示我相信都会吧!这里直接贴代码
了,一个Activity,一个适配器。
MainActivity:
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecylerview;
private MyRecyclerAdapter mAdapter;
private ArrayList<String> mList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
setData();
}
private void setData() {
mAdapter = new MyRecyclerAdapter(mList);
//LayoutManager布局管理器,控制摆放:线性摆放,
mRecylerview.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
mRecylerview.setAdapter(mAdapter);
}
private void initData() {
for (int i = 0; i < 30; i++) {
mList.add("item" + i);
}
}
private void initView() {
mRecylerview = (RecyclerView) findViewById(R.id.recyle_view);
mList = new ArrayList<>();
}
}
适配器代码:MyRecyclerAdapter:
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHoler> {
private List<String> mList;
private ListView mListview;
public MyRecyclerAdapter(ArrayList<String> mList) {
this.mList = mList;
}
@Override
public MyViewHoler onCreateViewHolder(ViewGroup viewGroup, int viewType) {
//创建ViewHorlder
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, null);
MyViewHoler myViewHoler = new MyViewHoler(view);
return myViewHoler;
}
@Override
public void onBindViewHolder(MyViewHoler holder, final int position) {
//绑定数据:
holder.mTv.setText(mList.get(position));
}
@Override
public int getItemCount() {
return mList == null ? 0 : mList.size();
}
class MyViewHoler extends RecyclerView.ViewHolder {
private TextView mTv;
public MyViewHoler(View itemView) {
super(itemView);
mTv = (TextView) itemView.findViewById(R.id.tv_item);
}
}
}
如图下所示:
既然谷歌不提供我们OnItemClickListener那我们自己来设置:
我们可以在适配器中来设置监听ItemView的点击事件,通过接口来回调让通知Activity进行进行对应的操作。
那么我们首先在适配器中定义一个接口:
interface OnItemClickListener {
void onItemClickListener(View view,int position);
}
并且设置一个方法用来进行回调:
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
当我们在onBindViewHolder赋值完成之后可以获取itemView的监听事件
,当触发时候来触发接口方法,这里代码如下:
@Override
public void onBindViewHolder(MyViewHoler holder, final int position) {
//绑定数据:
holder.mTv.setText(mList.get(position));
//这里设置每个ItemView的监听事件,然后触发我们自定义接口方法实现回调。
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClickListener.onItemClickListener(v,position);
}
});
}
最后在Activity里面设置监听事件进行回调:
mAdapter.setOnItemClickListener(new MyRecyclerAdapter.OnItemClickListener() {
@Override
public void onItemClickListener(View view, int position) {
Toast.makeText(MainActivity.this,"我是第:"+position+"条item", Toast.LENGTH_SHORT).show();
}
});
结果如图所示:
这里我们就完成了点击事件了,那么长按事件你自己也就会写了吧。
2)接下来了我们实现一个点击删除和添加指定的item功能然后宝宝就要睡觉了!明天如果有时间就继续写分割线的绘制:现在是23点48啦!
先上效果图片:
同样我们可以在适配器里面设置addList()和removeList()方法:
代码如下:
public void addList(String message, int position) {
mList.add(position, message);
notifyDataSetChanged();
}
public void removeList(int position) {
mList.remove(position);
notifyDataSetChanged();
}
在Activity里面直接设置点击事件调用效果如图所示:
当然了RecyclerView谷歌设置了很多的解决数据监听的方法
什么notifyItemInserted(position);notifyItemRemoved(position); notifyItemRangeChanged(int ,int);范围性更新..等方法,而且他会有动画效果。这里我也测试过在添加数据时候如果position为0那么添加的内容就这0以上看不见的,只有滑动之后才可以,这个有点烦,需要自己去测量滑动距离进行设置也可以实现刷新展现数据的。如果有时间就好好研究研究源码。真ta码6b。
测试代码如下:
public void addList(String message, int position) {
mList.add(position, message);
//notifyDataSetChanged();
notifyItemInserted(position);
// notifyItemRangeChanged(int ,int);
}
public void removeList(int position) {
mList.remove(position);
notifyDataSetChanged();
notifyItemRemoved(position);
}
效果图看看动画就可以:
下面贴上源码地址:需要自己下载哦!以后保证每篇博客都附上下载地址。
这jb gitHub晚上不开放么?没法登陆!上传百度云盘了。自行下载哦!
http://pan.baidu.com/s/1ge9cOoF
睡觉去了明天上班呀!