处理点击事件
不像ListVIew,RecyclerVIew没有onItemClick 接口,所以你需要在你的adapter里自己实现。在TravelListAdapter,创建一个局部变量来存放OnItemClickListener的实例
OnItemClickListener mItemClickListener;
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
你需要加上下面的方法在viewHolder的内部类
@Override
public void onClick(View v) {
}
最终,把这两个结合想起来
placeHolder.setOnClickListener(this);
在上面的代码里,你给placeHolder 初始化了setOnClickListener 然后重写了onClick 方法,你需要给RecyclerView实现onClick 借口。首先,在ViewHolder 类里定义如下的接口
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
然后创建它的setter方法
public void setOnItemClickListener(final OnItemClickListener mItemClickListener) {
this.mItemClickListener = mItemClickListener;
}
在onclick里处理逻辑
if (mItemClickListener != null) {
mItemClickListener.onItemClick(itemView, getPosition());
}
现在你点击屏幕就会看到如下的效果
在MainActivity创建OnItemClickListener 的实例
TravelListAdapter.OnItemClickListener onItemClickListener = new TravelListAdapter.OnItemClickListener() {
@Override
public void onItemClick(View v, int position) {
Toast.makeText(MainActivity.this, "Clicked " + position, Toast.LENGTH_SHORT).show();
}
};
最终,给adapter加上listener
mAdapter.setOnItemClickListener(onItemClickListener);
现在再运行,就能看到土司了
从List到Grid的转换
StaggeredLayoutManager 可以让你的布局随意变动。如果说你想让它每行显示两列,只需要spanCount 就可以了。
在toggle()方法里,加上if
mStaggeredLayoutManager.setSpanCount(2);
else
mStaggeredLayoutManager.setSpanCount(1);
现在的效果是这样的
使用Palette API
现在你可以加入一些有趣的Material Design特性。首先回到TravelListAdapter,在这里你讲会给placeNameHolder 增加一些动态的北京颜色。
在onBindViewHolder(…):里加上下面的代码
Bitmap photo = BitmapFactory.decodeResource(mContext.getResources(), place.getImageResourceId(mContext));
Palette.generateAsync(photo, new Palette.PaletteAsyncListener() {
public void onGenerated(Palette palette) {
int bgColor = palette.getMutedColor(mContext.getResources().getColor(android.R.color.black));
holder.placeNameHolder.setBackgroundColor(bgColor);
}
});
通过使用 generateAsync(…)给北京生成一个颜色调色板,你将会在调色板创建好了之后出发回调函数,在这里你可以设置背景,如果颜色不存在会使用android.R.color.black.