RecycleView虽然很强大,比如说高效,比如说高度解耦,比如说泛型的限制,比如说增加或者删除item的时候的高效刷新以及动画效果,但是强大了就没那么傻瓜化了,使用需要注意的地方这了稍微总结一下。
1,首先RecycleView是没有定义出onItemClick以及LongOnItemClick事件,需要使用者自己去定义回调listener接口。
在回调过程中也要注意一些细节,类似于快速滑动listview的时候展示的倒计时会错乱展示的一类问题,可能会出现:明明点击的是第1个item,但是回调监听提示的却说点击了第2个或者其他的item。
对于这类问题的解决方案:其实问题的原因是操作的item的position不统一导致的,解决办法就是,处理这个不统一,可以通过构造方法的方式来解决
import java.util.List;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.TextView;
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder> {
private List<String> list;
private OnItemClickListener mOnItemClickListener;
public MyRecyclerAdapter(List<String> list) {
// TODO Auto-generated constructor stub
this.list = list;
}
class MyViewHolder extends RecyclerView.ViewHolder{
TextView tv;
public MyViewHolder(View view) {
super(view);
tv = (TextView)view.findViewById(android.R.id.text1);
}
}
@Override
public int getItemCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
//绑定数据
holder.tv.setText(list.get(position));
//进行非空判断来增强代码健壮性
if(mOnItemClickListener!=null){
holder.itemView.setOnClickListener(new OnClickListener() {
/**
*所说的注意点就是这里,onBindViewHolder方法的position和onClick方法里面
*的回调方法中的position不一致导致的问题。
*解决办法:可以将这个onClick点击事件封装在一个内部类中,设置点击的时候就直接
*将onBindViewHolder方法中的position通过构造传递进去,从而避免了,直到点击
*了,执行了onClick方法才将position传递进去,也就避免了这个position的错乱。
*/
@Override
public void onClick(View v) {
mOnItemClickListener.onItemClick(v, position);
}
});
}
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int arg1) {
// 创建ViewHolder
MyViewHolder holder = new MyViewHolder(View.inflate(viewGroup.getContext(), android.R.layout.simple_list_item_1, null));
return holder;
}
public void addData(int position){
list.add(position,"additem"+position);
//提示刷新--会影响效率
// notifyDataSetChanged();
notifyItemInserted(position);
}
public void removeData(int position){
list.remove(position);
notifyItemRemoved(position);
}
public interface OnItemClickListener{
void onItemClick(View view, int position);
}
public void setOnItemClickListener(OnItemClickListener listener){
this.mOnItemClickListener = listener;
}
}