RecyclerView 使用总结(三):点击事件、GridView等、瀑布流、动态增删

来源:互联网 发布:数据体现不出邓肯作用 编辑:程序博客网 时间:2024/06/11 12:11

一、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了。

代码下载请点我

1 0