关于频道管理的步骤,根据步骤就可以少出错 1、mainActivity布局,添加values中color 2、drawable中设置两个圆角的自定义还有一个删除的图片 3、导入依赖。主要是recycle的依赖 包括dependencies 中的信息 dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:25.0.1' compile 'com.android.support:recyclerview-v7:25.0.1' } 4、编写ItemBean类 5、编写DataTools类 6、编写SimpleItemTouchHelperCallback 7、编写ItemTouchHelperAdapter接口,interface修饰的接口 8、编写RecyclerItemClickListener类 9、编写第二个布局item_list 1、首先在values中color属性里面添加<color name="red">#DF3234</color> <color name="black">#000000</color> <color name="white">#FFFFFF</color> <color name="hui">#999999</color>2、在draw中创建两个文件redsharp跟sharp
redsharp<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <solid android:color="@color/white" /> <!-- 定义填充的颜色值 --> <padding android:bottom="2dp" android:left="2dp" android:right="2dp" android:top="2dp" /> <!-- 设置圆角矩形 --> <corners android:radius="100dp" /> <stroke android:width="2dp" android:color="@color/red" /> </shape>sharp中代码<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <padding android:bottom="2dp" android:left="2dp" android:right="2dp" android:top="2dp" /> <!-- 设置圆角矩形 --> <corners android:radius="1dp" /> <stroke android:width="0.5dp" android:color="#000000" /> </shape>3、导入recycle的依赖,为了避免v7包跟v4包重复,我直接贴出来dependencees需要的代码PS:频道管理中的数据是用集合添加的假的数据,如果需要更改数据,可以在mainActivity下边的集合中dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:25.0.1' compile 'com.android.support:recyclerview-v7:25.0.1' }4、编写ItemBean类,类中的代码public ItemBean(String text, boolean select) { this.text = text; this.select = select; } private String text; private boolean select; public String getText() { return text; } public void setText(String text) { this.text = text; } public boolean isSelect() { return select; } public void setSelect(boolean select) { this.select = select; }5、编写dataTools,类中的代码public static int dip2px(Context context, int dipValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dipValue * scale + 0.5f); }6、编写SimpleItemTouchHelperCallback类,代码public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback { private ItemTouchHelperAdapter mAdapter; public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter) { mAdapter = adapter; } @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; //允许上下左右的拖动 return makeMovementFlags(dragFlags, 0); } @Override public boolean isLongPressDragEnabled() { return false;//长按启用拖拽 } @Override public boolean isItemViewSwipeEnabled() { return false; //不启用拖拽删除 } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) { //通过接口传递拖拽交换数据的起始位置和目标位置的ViewHolder mAdapter.onItemMove(source, target); return true; } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { //移动删除回调,如果不用可以不用理 // mAdapter.onItemDissmiss(viewHolder); } @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { super.onSelectedChanged(viewHolder, actionState); if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { //当滑动或者拖拽view的时候通过接口返回该ViewHolder mAdapter.onItemSelect(viewHolder); } } @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder); if (!recyclerView.isComputingLayout()) { //当需要清除之前在onSelectedChanged或者onChildDraw,onChildDrawOver设置的状态或者动画时通过接口返回该ViewHolder mAdapter.onItemClear(viewHolder); } } }
7、编写ItemTouchHelperAdapter接口,interface修饰的接口。代码public interface ItemTouchHelperAdapter { //数据交换 void onItemMove(RecyclerView.ViewHolder source, RecyclerView.ViewHolder target); //数据删除 void onItemDissmiss(RecyclerView.ViewHolder source); //drag或者swipe选中 void onItemSelect(RecyclerView.ViewHolder source); //状态清除 void onItemClear(RecyclerView.ViewHolder source); }
8、编写RecycleItemClickListener类public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener{ private View childView; private RecyclerView touchView; private RecyclerView.ViewHolder viewHolder; GestureDetector mGestureDetector; public RecyclerItemClickListener(Context context, final OnItemClickListener mListener) { mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener(){ @Override public boolean onSingleTapUp(MotionEvent ev) { if (childView != null && mListener != null) { mListener.onItemClick(childView, touchView.getChildPosition(childView),viewHolder); } return true; } @Override public void onLongPress(MotionEvent ev) { if (childView != null && mListener != null) { mListener.onLongClick(childView, touchView.getChildPosition(childView),viewHolder); } } }); } public interface OnItemClickListener { public void onItemClick(View view, int position, RecyclerView.ViewHolder viewHolder); public void onLongClick(View view, int posotion, RecyclerView.ViewHolder viewHolder); } @Override public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) { mGestureDetector.onTouchEvent(motionEvent); childView = recyclerView.findChildViewUnder(motionEvent.getX(), motionEvent.getY()); touchView = recyclerView; if (childView!=null){ viewHolder = recyclerView.getChildViewHolder(childView); } return false; } @Override public void onTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) { } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }
9、编写第二个布局文件item_list<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/channel_rl" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="5dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginTop="5dp" android:background="@drawable/sharp" > <TextView android:id="@+id/channel_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:gravity="center" android:paddingLeft="5dp" android:paddingRight="5dp" android:text="fdsgfdgdfgdfg" android:textSize="16sp" /> <TextView android:id="@+id/delete_tv" android:layout_width="15dp" android:layout_height="15dp" android:background="@drawable/delete" /> </RelativeLayout>
10、最后一步就是mainActivity里边的方法public class MainActivity extends AppCompatActivity { private RecyclerView minerecycleView; private List<ItemBean> mineData = new ArrayList<ItemBean>(); private List<ItemBean> otherData = new ArrayList<ItemBean>(); private ItemTouchHelper.Callback callback; private ItemTouchHelper touchHelper; private ItemTouchHelper.Callback othercallback; private ItemTouchHelper othertouchHelper; private MyAdapter otherAdapter; private RecyclerView other_recycleView; private MyAdapter mineAdapter; private TextView edit; boolean isediting = false; private int screenWidth; private int recycleview_width; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); screenWidth = dm.widthPixels; recycleview_width = (screenWidth - DataTools.dip2px(MainActivity.this, 60)) / 3; initData(); initView(); } private void initView() { minerecycleView = (RecyclerView) findViewById(R.id.mine_recycleView); edit = (TextView) findViewById(R.id.edit); mineAdapter = new MyAdapter(mineData, 0); //minerecycleView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); minerecycleView.setAdapter(mineAdapter); minerecycleView.setLayoutManager(new GridLayoutManager(this, 3)); callback = new SimpleItemTouchHelperCallback(mineAdapter); //用Callback构造ItemtouchHelper touchHelper = new ItemTouchHelper(callback); touchHelper.attachToRecyclerView(minerecycleView); other_recycleView = (RecyclerView) findViewById(R.id.other_recycleView); otherAdapter = new MyAdapter(otherData, 1); //other_recycleView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); other_recycleView.setAdapter(otherAdapter); other_recycleView.setLayoutManager(new GridLayoutManager(this, 3)); othercallback = new SimpleItemTouchHelperCallback(otherAdapter); //用Callback构造ItemtouchHelper othertouchHelper = new ItemTouchHelper(othercallback); othertouchHelper.attachToRecyclerView(other_recycleView); edit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (isediting) { edit.setText("编辑"); for (int i = 0; i < mineData.size(); i++) { mineData.get(i).setSelect(false); } } else { edit.setText("完成"); for (int i = 0; i < mineData.size(); i++) { mineData.get(i).setSelect(true); } } isediting = !isediting; mineAdapter.notifyDataSetChanged(); } }); minerecycleView.addOnItemTouchListener(new RecyclerItemClickListener(MainActivity.this, new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position, RecyclerView.ViewHolder childViewViewHolder) { } @Override public void onLongClick(View view, int posotion, RecyclerView.ViewHolder childViewViewHolder) { if (posotion != 0 && posotion != 1) { touchHelper.startDrag(childViewViewHolder); } } })); other_recycleView.addOnItemTouchListener(new RecyclerItemClickListener(MainActivity.this, new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, final int position, RecyclerView.ViewHolder childViewViewHolder) { final ImageView moveImageView = getView(view); if (moveImageView != null) { TextView newTextView = (TextView) view.findViewById(R.id.channel_tv); final int[] startLocation = new int[2]; newTextView.getLocationInWindow(startLocation); final ItemBean channel = otherAdapter.getItem(position); if (isediting) { channel.setSelect(true); } else { channel.setSelect(false); } mineAdapter.addItem(channel); new Handler().postDelayed(new Runnable() { public void run() { try { int[] endLocation = new int[2]; RecyclerView.LayoutManager mine_layoutManager = minerecycleView.getLayoutManager(); if (mine_layoutManager instanceof LinearLayoutManager) { LinearLayoutManager linearManager = (LinearLayoutManager) mine_layoutManager; int lastItemPosition = linearManager.findLastVisibleItemPosition(); minerecycleView.getChildAt(lastItemPosition).getLocationInWindow(endLocation); MoveAnim(moveImageView, startLocation, endLocation); otherAdapter.deleteItem(position); } } catch (Exception localException) { } } }, 50L); } } @Override public void onLongClick(View view, int posotion, RecyclerView.ViewHolder childViewViewHolder) { } })); } private void initData() { for (int i = 0; i < 15; i++) { mineData.add(new ItemBean("我的" + i, false)); } for (int i = 15; i < 30; i++) { otherData.add(new ItemBean("其他" + i, false)); } } public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> implements ItemTouchHelperAdapter { private List<ItemBean> mData; private int type; // 自己 长按出× 按 ×删除 别人的只有 一个点击删除的操作 // 别人的只有点击添加操作 public MyAdapter(List<ItemBean> list, int type) { this.mData = list; this.type = type; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View root = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_list, parent, false); MyViewHolder vh = new MyViewHolder(root); //为Item设置点击事件 return vh; } @Override public void onBindViewHolder(final MyViewHolder holder, final int position) { holder.channel_tv.setText(mData.get(position).getText()); if (type == 1) { holder.delete_tv.setVisibility(View.GONE); } else if (type == 0) { if (position == 0 || position == 1) { holder.delete_tv.setVisibility(View.GONE); } else if (mData.get(position).isSelect()) { holder.delete_tv.setVisibility(View.VISIBLE); } else { holder.delete_tv.setVisibility(View.GONE); } } ViewGroup.LayoutParams params = holder.channel_rl.getLayoutParams(); params.width = recycleview_width; holder.channel_rl.setLayoutParams(params); holder.delete_tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (type == 0) { ItemBean positionItemBean = mineAdapter.getItem(position); positionItemBean.setSelect(false); mineAdapter.deleteItem(position); otherAdapter.addItem(positionItemBean); } } }); } @Override public int getItemCount() { //注意:这里最少有一个,因为有多了一个添加按钮 return null == mData ? 0 : mData.size(); } public ItemBean getItem(int position) { return mData.get(position); } public void addItem(ItemBean channel) { mData.add(channel); notifyDataSetChanged(); } public void allSelect() { for (int i = 0; i < mData.size(); i++) { mData.get(i).setSelect(true); } notifyDataSetChanged(); } public void addItem(int position, ItemBean channel) { mData.add(position, channel); notifyDataSetChanged(); } public void deleteItem(int position) { mData.remove(position); notifyDataSetChanged(); } public class MyViewHolder extends RecyclerView.ViewHolder { private TextView channel_tv; private TextView delete_tv; private RelativeLayout channel_rl; public MyViewHolder(View itemView) { super(itemView); channel_tv = (TextView) itemView.findViewById(R.id.channel_tv); delete_tv = (TextView) itemView.findViewById(R.id.delete_tv); channel_rl = (RelativeLayout) itemView.findViewById(R.id.channel_rl); } } //移动处理 public void onItemMove(RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) { if (type == 0) { int fromPosition = source.getAdapterPosition(); int toPosition = target.getAdapterPosition(); if (toPosition == 0 || toPosition == 1) { } else { if (fromPosition < mData.size() && toPosition < mData.size()) { //交换数据位置 // Collections.swap(mData, fromPosition, toPosition); ItemBean itemBean = mData.get(fromPosition); mData.remove(fromPosition); mData.add(toPosition, itemBean); //刷新位置交换 notifyItemMoved(fromPosition, toPosition); } } //移动过程中移除view的放大效果 onItemClear(source); } } //移除 public void onItemDissmiss(RecyclerView.ViewHolder source) { if (type == 0) { int position = source.getAdapterPosition(); mData.remove(position); //移除数据 notifyItemRemoved(position);//刷新数据移除 } } //放大 public void onItemSelect(RecyclerView.ViewHolder viewHolder) { if (type == 0) { //当拖拽选中时放大选中的view int position = viewHolder.getAdapterPosition(); viewHolder.itemView.setScaleX(1.2f); viewHolder.itemView.setScaleY(1.2f); } } //恢复 public void onItemClear(RecyclerView.ViewHolder viewHolder) { //拖拽结束后恢复view的状态 if (type == 0) { viewHolder.itemView.setScaleX(1.0f); viewHolder.itemView.setScaleY(1.0f); } } } private ImageView getView(View view) { view.destroyDrawingCache(); view.setDrawingCacheEnabled(true); Bitmap cache = Bitmap.createBitmap(view.getDrawingCache()); view.setDrawingCacheEnabled(false); ImageView iv = new ImageView(this); iv.setImageBitmap(cache); return iv; } private void MoveAnim(View moveView, int[] startLocation, int[] endLocation ) { int[] initLocation = new int[2]; moveView.getLocationInWindow(initLocation); final ViewGroup moveViewGroup = getMoveViewGroup(); final View mMoveView = getMoveView(moveViewGroup, moveView, initLocation); TranslateAnimation moveAnimation = new TranslateAnimation( startLocation[0], endLocation[0], startLocation[1], endLocation[1]); moveAnimation.setDuration(300L); AnimationSet moveAnimationSet = new AnimationSet(true); moveAnimationSet.setFillAfter(false); moveAnimationSet.addAnimation(moveAnimation); mMoveView.startAnimation(moveAnimationSet); moveAnimationSet.setAnimationListener(new Animation.AnimationListener() { private boolean isMove; @Override public void onAnimationStart(Animation animation) { isMove = true; } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { moveViewGroup.removeView(mMoveView); isMove = false; } }); } private ViewGroup getMoveViewGroup() { ViewGroup moveViewGroup = (ViewGroup) getWindow().getDecorView(); LinearLayout moveLinearLayout = new LinearLayout(this); moveLinearLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); moveViewGroup.addView(moveLinearLayout); return moveLinearLayout; } private View getMoveView(ViewGroup viewGroup, View view, int[] initLocation) { int x = initLocation[0]; int y = initLocation[1]; viewGroup.addView(view); LinearLayout.LayoutParams mLayoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); mLayoutParams.leftMargin = x; mLayoutParams.topMargin = y; view.setLayoutParams(mLayoutParams); return view; } }11、mainActivity里边的布局<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center|left" android:paddingLeft="20dp" android:text="我的频道" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center_vertical|left" android:paddingLeft="10dp" android:text="长按拖拽替换位置" android:textSize="15sp" /> <TextView android:id="@+id/edit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:background="@drawable/redsharp" android:gravity="center" android:paddingLeft="20dp" android:paddingRight="20dp" android:text="编辑" android:textSize="15sp" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/hui" /> <android.support.v7.widget.RecyclerView android:id="@+id/mine_recycleView" android:layout_width="match_parent" android:layout_height="wrap_content" /> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/hui" /> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center|left" android:paddingLeft="20dp" android:text="其他频道" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center_vertical|left" android:paddingLeft="10dp" android:text="点击添加替换我的频道中" android:textSize="15sp" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/hui" /> <android.support.v7.widget.RecyclerView android:id="@+id/other_recycleView" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
修改。这是根据自己网上copy的代码,然后整理的编写步骤。
关于频道管理,可拖拽 长按可选择删除
最新推荐文章于 2022-08-16 20:32:20 发布