一、RecyclerView的点击事件
实现方法:在适配器Adapter中定义接口,接口中定义两个方法:一个点击事件、一个长按事件。然后在onBindViewHolder中调用,利用view.setOnClickListener()和view.setOnLongClickListener()方法实现。最后在Activity中给适配器设置监听接口的对象就ok了。代码如下,适配器:
监听接口
public interface OnRecyclerViewItemListener {
public void onItemClickListener(View view,int position);
public void onItemLongClickListener(View view, int position);
}
private OnRecyclerViewItemListener mOnRecyclerViewItemListener;
public void setOnRecyclerViewItemListener(OnRecyclerViewItemListener listener){
mOnRecyclerViewItemListener = listener;
}
点击事件:
private void itemOnClick(final RecyclerView.ViewHolder holder){
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = holder.getLayoutPosition(); mOnRecyclerViewItemListener.onItemClickListener(holder.itemView, pos);
}
});
}
长按事件:
private void itemOnLongClick(final RecyclerView.ViewHolder holder){
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int pos = holder.getLayoutPosition(); mOnRecyclerViewItemListener.onItemLongClickListener(holder.itemView, pos);
//返回true是为了防止触发onClick事件
return true;
}
});
}
在onBindViewHolder中调用:
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
holder).textView.setText(mDatas.get(position));
//getLayoutPosition()方法会准确的获取到item的位置id
onItemSonViewClick(holder);
if (mOnRecyclerViewItemListener != null){
itemOnClick(holder);
itemOnLongClick(holder);
}
}
activity中的代码:
private void onRecyclerItemClickListener(){
mAdapter.setOnRecyclerViewItemListener(new RecyclerViewAdapter.OnRecyclerViewItemListener() {
@Override
public void onItemClickListener(View view, int position) {
Toast.makeText(MainActivity.this,"onClick:"+position,Toast.LENGTH_SHORT).show();
}
@Override
public void onItemLongClickListener(View view, int position) {
Toast.makeText(MainActivity.this,"onLongClick:"+position,Toast.LENGTH_SHORT).show();
}
});
}
到此,RecyclerView的点击事件实现了。
二、用RecyclerView实现GridView、横向GridView、横向ListView
注意:此时不要添加分割线了,即去掉recyclerView.addItemDecoration()方法,在子View的布局中的最外层的Layout中添加android:layout_margin=”3dp”来实现分割线。
实现这三个的思路是一样的,都是更改LayoutManger就可以完成了,一句代码的事。
①、GridView:
mRecyclerView.setLayoutManager(new GridLayoutManager(this,3));
②、横向GridView:
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.HORIZONTAL));
③、横向ListView:
mRecyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false));
三、瀑布流的实现
思路:相当在GridView中把Item的高度设置成不同的,即在适配器Adapter中添加一个高度的集合,在onBindViewHolder中设置itemView的高度即可。
适配器:
public class WaterFallAdapter extends RecyclerView.Adapter<WaterFallAdapter.WaterFallItemHolder> {
private Context mContext;
private LayoutInflater mInflater;
public List<String> mDatas;
private List<Integer> heights;
public WaterFallAdapter(Context context, List<String> datas) {
this.mContext = context;
this.mDatas = datas;
mInflater = LayoutInflater.from(mContext);
heights = new ArrayList<>();
for (int i = 0;i<mDatas.size();i++){
heights.add((int)(100+Math.random()*300));
}
}
@Override
public void onBindViewHolder(WaterFallAdapter.WaterFallItemHolder holder, final int position) {
holder.textView.setText(mDatas.get(position));
ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
lp.height = heights.get(position);
holder.itemView.setLayoutParams(lp);
}
@Override
public WaterFallAdapter.WaterFallItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.waterfall_item, parent, false);
WaterFallItemHolder mItemViewHolder = new WaterFallItemHolder(view);
return mItemViewHolder;
}
@Override
public int getItemCount() {
return mDatas.size();
}
class WaterFallItemHolder extends RecyclerView.ViewHolder {
protected TextView textView;
public WaterFallItemHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.text_view);
}
}
}
WaterfallActivity.java:
public class WaterFallActivity extends Activity {
private RecyclerView recyclerView;
private List<String> datas;
private WaterFallAdapter waterFallAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.water_fall);
initDatas();
initView();
}
private void initDatas(){
datas = new ArrayList<>();
for (int i = 'A';i<'z';i++){
datas.add(""+(char)i);
}
}
private void initView(){
recyclerView = (RecyclerView) findViewById(R.id.waterfall_recycler_view);
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
waterFallAdapter = new WaterFallAdapter(this,datas);
recyclerView.setAdapter(waterFallAdapter);
}
}
至此,瀑布流实现了。
四、RecyclerView中item的增加、移除动画
①、设置动画属性:recyclerView.setItemAnimator(new DefaultItemAnimator());
DefaultItemAnimator是自带的一个动画效果,在github上有其他的动画效果:https://github.com/gabrielemariotti/RecyclerViewItemAnimators
使用方法看一下github就知道了。
②、在适配器Adapter中定义 增加、移除两个方法:
public void insertData(String data,int position){
mDatas.add(position,data);
//注意这里一定是用notifyItemInserted()方法来更新,如果用notifyDataSetChanged()的话,就没有动画效果了。
notifyItemInserted(position);
}
public void removeData(int position){
mDatas.remove(position);
//注意这里一定是用notifyItemRemoved()方法来更新,如果用notifyDataSetChanged()的话,就没有动画效果了。
notifyItemRemoved(position);
}
注意:此时处理点击事件时,一定要用holder.getLayoutPosition()来获取位置id,且要放在点击事件接口的方法中。
然后在Activity中调用这两个方法就ok了。