RecyclerView 是5.0之后的新控件,类似于GridView 和 ListView,但是可塑性上要强过前者不少,网上已经有很多RecyclerView的例子了,今天自己写了几中样式的合集,希望能更好的帮助理解。
首先 ,RecyclerView 有一个 比较坑的地方,它本身不提供类似于ListView的OnItemClickListener() 方法 和 OnItemLongClickListener()方法,需要我们自己手动写一个。
写之前 先把RecyclerView引进来
compile 'com.android.support:recyclerview-v7:23.4.0'
首先先写两个接口
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
public interface OnItemLongClickListener {
void onItemLongClick(View view, int position);
}
然后可以开始写RecyclerView 的 Adapter了
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{
private Context mContext;
private List<String> list;
private OnItemClickListener mOnItemClickListener;
private OnItemLongClickListener mOnItemLongClickListener;
public void setOnItemClickListener(OnItemClickListener mOnItemClickListener){
this.mOnItemClickListener = mOnItemClickListener;
}
public void setOnItemLongClickListener(OnItemLongClickListener mOnItemLongClickListener) {
this.mOnItemLongClickListener = mOnItemLongClickListener;
}
public RecyclerViewAdapter(Context mContext, List<String> list) {
this.mContext = mContext;
this.list = list;
}
@Override
public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.iteam_recycle, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final RecyclerViewAdapter.ViewHolder holder, int position) {
TextView textView = (TextView) holder.mView.findViewById(R.id.text2);
textView.setText(list.get(position).toString());
if(mOnItemClickListener != null){
//为ItemView设置监听器
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = holder.getLayoutPosition(); // 1
mOnItemClickListener.onItemClick(holder.itemView,position); // 2
}
});
}
if(mOnItemLongClickListener != null){
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int position = holder.getLayoutPosition();
mOnItemLongClickListener.onItemLongClick(holder.itemView,position);
//返回true 表示消耗了事件 事件不会继续传递
return true;
}
});
}
}
@Override
public int getItemCount() {
return list.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public final View mView;
public ViewHolder(View view) {
super(view);
mView = view;
}
}
}
RecyclerView 的Adapter 代码和 ListView 的Adapter代码略有不同,不过也不难理解
首先需要继承RecyclerView.Adapter
public class RecycleActivity extends Activity {
private RecyclerView mRecyclerView;
private RecyclerViewAdapter recyclerViewAdapter;
private List<String> list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycle);
recycleType = getIntent().getIntExtra("type",1);
initDate();
initView();
}
private void initDate() {
for (int i = 0; i<20; i++){
list.add(i,"第" + String.valueOf(i)+ "个");
}
}
private void initView() {
mRecyclerView = (RecyclerView) findViewById(R.id.recycleView);
recyclerViewAdapter = new RecyclerViewAdapter(this,list);
//listview 样式
// mRecyclerView.setLayoutManager(new LinearLayoutManager(mRecyclerView.getContext()));
//gridview 样式
// mRecyclerView.setLayoutManager(new GridLayoutManager(mRecyclerView.getContext(),2));
//可以跨列的gridview 样式
GridLayoutManager llmv;
llmv = new GridLayoutManager(this,2, GridLayoutManager.VERTICAL, false);
llmv.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
//返回值:跨列数
if (position % 3 == 2){
return 2;
}
return 1;
}
});
mRecyclerView.setLayoutManager(llmv);
//item Click点击事件
recyclerViewAdapter.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Snackbar.make(view, "Snackbar comes out", Snackbar.LENGTH_LONG)
.setAction("点我就返回了", new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
}).show();
}
});
//item 长按事件
recyclerViewAdapter.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public void onItemLongClick(View view, int position) {
Toast.makeText(RecycleActivity.this, ((TextView) view.findViewById(R.id.text2)).getText(),Toast.LENGTH_SHORT).show();
}
});
mRecyclerView.setAdapter(recyclerViewAdapter);
}
}
RecyclerView.LayoutManager,这是一个抽象类,好在系统提供了3个实现类:
1,LinearLayoutManager 现行管理器,支持横向、纵向。
2,GridLayoutManager 网格布局管理器
3,StaggeredGridLayoutManager 瀑布就式布局管理器
我在上面代码里实现了前两种,而且还做了一个可以跨列的GridView(说多了都是泪,坑比需求!!)
第三种瀑布流的样式在 鸿洋 大神的微博里已经有介绍了,这里就不写了~~
最后上一个跨列 gridview 的效果图(有点像砖墙~~)
好了~~
最后希望每天都能进步一点~~加油!