android 瀑布流布局 + 自由拖拽
来源:互联网 发布:js encode 编辑:程序博客网 时间:2024/05/17 01:25
首先,确定使用RecyclerView
我们需要 导包 把
compile 'com.android.support:recyclerview-v7:25.3.0'
加入dependencies
定义适配器
MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder>{ public TextView item_info; public TextView item_title; public ImageView imageView; public ViewHolder(View view) { super(view); //item_title = (TextView) view.findViewById(R.id.title_1); // item_info = (TextView) view.findViewById(R.id.info_1); imageView = (ImageView) view.findViewById(R.id.sample_icon); } }
在MyRecyclerViewAdapter中定义内部类
//自定义的ViewHolder,持有每个Item的的所有界面元素 public static class ViewHolder extends RecyclerView.ViewHolder
由于RecyclerView不再负责Item视图的布局及显示,所以RecyclerView也没有为Item开放OnItemClick等点击事件,这就需要开发者自己实现。
//define interface public static interface OnRecyclerViewItemClickListener { void onItemClick(View view , Object object); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = mInflater.inflate(R.layout.recycler_item, parent, false); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mOnItemClickListener != null) { //注意这里使用getTag方法获取数据 mOnItemClickListener.onItemClick(v,v.getTag()); } } }); ViewHolder viewHolder = new ViewHolder(view); return viewHolder; } /** * 数据的绑定显示 * * @param holder * @param position */ @Override public void onBindViewHolder(ViewHolder holder, int position) { //to do bind view//把数据绑到每个itemView上; holder.itemView.setTag(mData.get(position));} @Override public int getItemCount() { return mData.size(); }
在MainActivity onCreate
mTitles = new ArrayList(); final RecyclerView recview = (RecyclerView) findViewById(R.id.recview); adapter = new MyRecyclerViewAdapter(this,mTitles); adapter.setOnItemClickListener(new MyRecyclerViewAdapter.OnRecyclerViewItemClickListener() { @Override public void onItemClick(View view, Object object) { Log.e("onItemClick",object+""); } }); // LinearLayoutManager layoutManager = new LinearLayoutManager(this); // GridLayoutManager layoutManager=new GridLayoutManager(this,2); // StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, // StaggeredGridLayoutManager.HORIZONTAL); StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager( 3, StaggeredGridLayoutManager.VERTICAL); //设置布局管理器 ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelperCallback(mTitles,adapter)); helper.attachToRecyclerView(recview); recview.setLayoutManager(layoutManager); recview.setAdapter(adapter);
定义接口
public interface ItemTouchHelperViewHolder { /** * 当Item开始拖拽或者滑动的时候调用 */ void onItemSelected(); /** * 当Item完成拖拽或者滑动的时候调用 */ void onItemClear();}
让上面的ViewHolder去实现 就可以根据情况改变
public static class ViewHolder extends RecyclerView.ViewHolder implements ItemTouchHelperViewHolder
定义ItemTouchHelperCallback
public class ItemTouchHelperCallback extends ItemTouchHelper.Callback { private List mData; private RecyclerView.Adapter adapter; public ItemTouchHelperCallback(List mData, RecyclerView.Adapter adapter) { this.mData = mData; this.adapter = adapter; } @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { //首先回调的方法 返回int表示是否监听该方向 int dragFlags = ItemTouchHelper.UP|ItemTouchHelper.DOWN|ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT;//拖拽 int swipeFlags = 0 ;//侧滑删除 return makeMovementFlags(dragFlags,swipeFlags); } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { //滑动事件 Collections.swap(mData,viewHolder.getAdapterPosition(),target.getAdapterPosition()); adapter.notifyItemMoved(viewHolder.getAdapterPosition(),target.getAdapterPosition()); return false; } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { //侧滑事件 // mData.remove(viewHolder.getAdapterPosition()); // adapter.notifyItemRemoved(viewHolder.getAdapterPosition()); } @Override public boolean isLongPressDragEnabled() { //是否可拖拽 return true; } /** * 当拖拽开始的时候调用 * * @param viewHolder * @param actionState */ @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { //拖拽的时候 if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { if (viewHolder instanceof ItemTouchHelperViewHolder) { //让ViewHolder知道Item开始选中 ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder; //回调ItemTouchHelperVIewHolder的方法 itemViewHolder.onItemSelected(); } } super.onSelectedChanged(viewHolder, actionState); } /** * 当拖拽结束的时候调用 * * @param recyclerView * @param viewHolder */ @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder); if (viewHolder instanceof ItemTouchHelperViewHolder) { ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder; //Item移动完成之后的回调 itemViewHolder.onItemClear(); } }}
1 0
- android 瀑布流布局 + 自由拖拽
- Android 瀑布流布局
- Android中的瀑布流布局
- Android RecyclerView实现瀑布流布局
- Android版的瀑布流布局
- 瀑布流布局浅析
- 瀑布流布局
- 瀑布流布局浅析
- 瀑布流布局浅析
- 瀑布流布局浅析
- js瀑布流布局
- 瀑布流布局浅析
- 瀑布流布局浅析
- 瀑布流布局浅析
- 瀑布流布局浅析
- 瀑布流布局浅析
- 图片瀑布流布局
- 瀑布流布局代码
- CSS3的属性选择器
- mysq对数据的l查询,增加,修改和删除sql语句
- freecodecamp advance algorithm scripting
- 简单的爬取新浪新闻标题与链接
- python和lua的socket实例
- android 瀑布流布局 + 自由拖拽
- 利用AXIS2返回JSON
- 1011. A+B和C (15)
- 程序员的思考
- LeetCode 61. Rotate List
- 字符集与编码二之编号 vs 编码
- reactNative react.children.only expected to receive a single react element child.问题
- OpenGLES的简单应用绘图,以及照相机画面变色变形渲染(六)
- centos7中安装redis