最近在学习5.0控件RecyclerView的使用,虽然在功能上比ListView要强大很多,特别是动效上的,但在代码上就要比ListView多些了,在这里备下份,也许以后用得到。
首先是RecyclerView也有一个自己的Adapter,但不是基于BaseAdapter,是RecyclerView.Adapter,RecyclerView一定要使用ViewHolder,而不像ListView那样可以不使用。
下面是Demo:
package com.example.recycleview.adapter;
import com.example.recycleview.R;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;
class DemoViewHolder extends RecyclerView.ViewHolder {
private String data;
private TextView contentTV;
public DemoViewHolder(View itemView, int position) {
super(itemView);
contentTV = (TextView) itemView.findViewById(R.id.content_tv);
}
public void setData(String data) {
if(this.data != data) {
this.data = data;
}
contentTV.setText(this.data);
}
}
这是一个简单的ViewHolder,接下来是Adapter
package com.example.recycleview.adapter;
import java.util.List;
import com.example.recycleview.R;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Toast;
public class DemoAdapter extends RecyclerView.Adapter<DemoViewHolder>{
private List<String> datas;
private Context mContext;
public DemoAdapter(Context context) {
super();
mContext = context;
}
public void setDatas(List<String> datas) {
if(this.datas != datas) {
this.datas = datas;
}
}
@Override
public int getItemCount() {
return datas.size();
}
@Override
public void onBindViewHolder(final DemoViewHolder viewHolder, final int position) {
viewHolder.setData(datas.get(position));
viewHolder.itemView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//获取当前的positon,如果有更新改变后的position,可以不用
// int pos = viewHolder.getLayoutPosition();
Toast.makeText(mContext, position + "", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public DemoViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.demo_recycleview_item, viewGroup, false);
return new DemoViewHolder(v, position);
}
/**
* @param position
*/
public void addData(int position) {
datas.add(position, "Insert One");
notifyItemInserted(position);
//增加,删除数据后需要提示其它位置的position变化,不然还是以前的position
notifyItemRangeChanged(position, datas.size());
}
public void removeData(int position) {
datas.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, datas.size());
}
}
在这里要特别强调下 notifyItemRangeChanged(position, datas.size());的使用,只有这样才可以让修改的数据通知后面的item,不然就只有通过viewHolder.getLayoutPosition();来获取当前最新的位置了。
接下来说下如何使用
demoAdapter.setDatas(datas);
demoStaggeredAdapter = new DemoStaggeredAdapter(this);
demoStaggeredAdapter.setDatas(datas);
recyclerView.setAdapter(demoAdapter);
dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST);
dividerGridItemDecoration = new DividerGridItemDecoration(this);
recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayout.VERTICAL, false));
recyclerView.setItemAnimator(new DefaultItemAnimator());//设置动效
recyclerView.addItemDecoration(dividerItemDecoration);//设置分隔线
//分隔线另一个库代码设置
// recyclerView
// .addItemDecoration(new HorizontalDividerItemDecoration.Builder(
// this)
// .color(Color.RED)
// .size(getResources().getDimensionPixelSize(
// R.dimen.divider))
// .margin(getResources().getDimensionPixelSize(
// R.dimen.leftmargin),
// getResources().getDimensionPixelSize(
// R.dimen.rightmargin)).build());
分隔线比较麻烦,但可以从git上找些下来用,这个就比listview比较麻烦先。