package com.samton.newdemo.activity; import android.content.Context; import android.graphics.Color; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Gri public class RecycleViewActivity extends AppCompatActivity { private RecyclerView myRecycleView; private List<ItemBean> list; private MyRecycleViewAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recycle_view); initData(); initView(); } /** * 初始化数据 */ private void initData() { list = new ArrayList<>(); for (int i = 0; i < 100; i++) { ItemBean itemBean = new ItemBean(); itemBean.setContent("" + (i + 1)); itemBean.setType(new Random().nextInt(4)); list.add(itemBean); } adapter = new MyRecycleViewAdapter(list, this); } /** * 初始化控件 */ private void initView() { myRecycleView = ((RecyclerView) findViewById(R.id.recycle)); myRecycleView.setLayoutManager(new StaggeredGridLayoutManager(3, RecyclerView.VERTICAL)); myRecycleView.setAdapter(adapter); MyItemTouchHelpCallBack touchHelp = new MyItemTouchHelpCallBack(list, adapter); ItemTouchHelper touchHelper = new ItemTouchHelper(touchHelp); touchHelper.attachToRecyclerView(myRecycleView); } /** * 重写 ItemTouchHelper.Callback */ class MyItemTouchHelpCallBack extends ItemTouchHelper.Callback { private List<ItemBean> list; private MyRecycleViewAdapter adapter; public MyItemTouchHelpCallBack(List<ItemBean> list, MyRecycleViewAdapter adapter) { this.list = list; this.adapter = adapter; } @Override public boolean isLongPressDragEnabled() { return true; } @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { if ((recyclerView.getLayoutManager() instanceof GridLayoutManager) || (recyclerView.getLayoutManager() instanceof StaggeredGridLayoutManager)) { final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; final int swipeFlags = 0; return makeMovementFlags(dragFlags, swipeFlags); } else { final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; final int swipeFlags = 0; return makeMovementFlags(dragFlags, swipeFlags); } } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { synchronized (MyItemTouchHelpCallBack.this) { int fromPostion = viewHolder.getAdapterPosition(); int toPostion = target.getAdapterPosition(); //交换数据 if (fromPostion < toPostion) { for (int i = fromPostion; i < toPostion; i++) { Collections.swap(list, i, i + 1); } } else { for (int i = fromPostion; i > toPostion; i--) { Collections.swap(list, i, i - 1); } } //交换item 位置 并更新UI adapter.notifyItemMoved(fromPostion, toPostion); return true; } } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { } @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { //按下的item 设置高亮 if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { viewHolder.itemView.setBackgroundColor(Color.LTGRAY); } super.onSelectedChanged(viewHolder, actionState); } } class MyRecycleViewAdapter extends RecyclerView.Adapter { private List<ItemBean> list; private Context context; public MyRecycleViewAdapter(List<ItemBean> list, Context context) { this.list = list; this.context = context; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType) { case 1: parent = (ViewGroup) LayoutInflater.from(context).inflate(R.layout.item1, parent, false); break; case 2: parent = (ViewGroup) LayoutInflater.from(context).inflate(R.layout.item2, parent, false); break; case 3: parent = (ViewGroup) LayoutInflater.from(context).inflate(R.layout.item3, parent, false); break; default: parent = (ViewGroup) LayoutInflater.from(context).inflate(R.layout.item, parent, false); break; } return new ViewHolder(parent); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { ((ViewHolder) holder).tv.setText(list.get(position).getContent()); } @Override public int getItemViewType(int position) { return list != null ? list.get(position).getType() : 0; } @Override public int getItemCount() { return list != null ? list.size() : 0; } class ViewHolder extends RecyclerView.ViewHolder { public TextView tv; public ViewHolder(View itemView) { super(itemView); tv = ((TextView) itemView.findViewById(R.id.tv)); } } } }
RecycleView 瀑布流 item 随意拖拽(ItemTouchHelper) 数据交换
最新推荐文章于 2022-07-04 17:01:30 发布