赞
踩
仿腾讯视频中全部频道界面,首个精选长按不能拖动,其余的可以拖动。
//Butter Knife
implementation 'com.jakewharton:butterknife:10.2.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0'
//TitleBar
implementation 'com.github.getActivity:TitleBar:8.6'
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.hjq.bar.TitleBar
android:id="@+id/title_bar"
android:layout_width="match_parent"
android:background="@color/purple_200"
android:layout_height="?android:attr/actionBarSize"
app:title="@string/rv_grid"
app:titleSize="18sp"
app:titleStyle="bold"
app:backButton="false"
app:titleColor="@color/white"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_gird"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/img_item"
android:layout_width="80dp"
android:layout_height="80dp"
app:srcCompat="@mipmap/ic_launcher"/>
<TextView
android:id="@+id/tv_title"
android:layout_marginTop="12dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/text_color"
android:textSize="16sp"
android:text="item"/>
</LinearLayout>
1. GridActivity.java
public class GirdActivity extends BaseActivity {
@BindView(R.id.rv_gird)
RecyclerView mRecyclerView;
private GirdAdapter mAdapter;
List<String> mStringList;
@Override
protected int getLayoutId() {
return R.layout.activity_gird;
}
@Override
protected void initView() {
if (mStringList == null) {
mStringList = new ArrayList<>();
}
mStringList.addAll(DataManager.getData(9));
mAdapter = new GirdAdapter(R.layout.grid_item, mStringList, true);
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 4));
mRecyclerView.addItemDecoration(new MyItemDecoration());
mRecyclerView.setHasFixedSize(true);
RecyItemTouchHelperCallback itemTouchHelperCallback = new RecyItemTouchHelperCallback(mAdapter, false, true);
final ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemTouchHelperCallback);
itemTouchHelper.attachToRecyclerView(mRecyclerView);
mRecyclerView.addOnItemTouchListener(new OnRecyclerItemClickListener(mRecyclerView) {
@Override
public void onItemClick(RecyclerView.ViewHolder viewHolder) {
GirdAdapter.ViewHolder viewHolder1 = (GirdAdapter.ViewHolder) viewHolder;
String tvString = viewHolder1.mTextView.getText().toString();
Toast.makeText(GirdActivity.this, "点击了..." + tvString, Toast.LENGTH_SHORT).show();
}
@Override
public void onLongClick(RecyclerView.ViewHolder viewHolder) {
Toast.makeText(GirdActivity.this, "" + "长按拖动...", Toast.LENGTH_SHORT).show();
if (viewHolder.getLayoutPosition() != 0) {
itemTouchHelper.startDrag(viewHolder);
}
}
});
mRecyclerView.setAdapter(mAdapter);
}
public static class MyItemDecoration extends RecyclerView.ItemDecoration{
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
outRect.set(0,0,20,20);
}
}
}
2. 适配器代码
public class GirdAdapter extends RecyclerView.Adapter<GirdAdapter.ViewHolder> {
private int item_layout;
private List<String> mDataList;
private List<Integer> mInts;
private boolean isFirstSpecial;
public GirdAdapter(int item_layout, List<String> dataList) {
this.item_layout = item_layout;
mDataList = dataList;
mInts = Arrays.asList(R.mipmap.ic_apple, R.mipmap.ic_banana,
R.mipmap.ic_cherry, R.mipmap.ic_grape,
R.mipmap.ic_mango, R.mipmap.ic_pineapple,
R.mipmap.ic_orange, R.mipmap.ic_pear, R.mipmap.ic_strawberry);
}
public GirdAdapter(int item_layout, List<String> dataList, boolean isFirstSpecial) {
this(item_layout, dataList);
this.isFirstSpecial = isFirstSpecial;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(item_layout, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
String string = mDataList.get(position);
if (isFirstSpecial && position == 0) {
holder.itemView.setBackgroundColor(Color.LTGRAY);
holder.mTextView.setText("苹果");
holder.mImageView.setImageResource(R.mipmap.ic_apple);
} else {
holder.itemView.setBackgroundColor(Color.WHITE);
holder.mTextView.setText(string);
holder.mImageView.setImageResource(mInts.get(position % mInts.size()));
}
}
@Override
public int getItemCount() {
return mDataList == null ? 0 : mDataList.size();
}
public List<String> getDataList() {
return mDataList;
}
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;
ImageView mImageView;
ViewHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView.findViewById(R.id.tv_title);
mImageView = (ImageView) itemView.findViewById(R.id.img_item);
}
}
}
3. RecyclerView 点击事件
/**
* Created on 2022/3/19 14:30
*
* @author Gong Youqiang
*/
public abstract class OnRecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
private GestureDetectorCompat mGestureDetectorCompat;
private RecyclerView mRecyclerView;
public OnRecyclerItemClickListener(RecyclerView recyclerView) {
mRecyclerView = recyclerView;
mGestureDetectorCompat = new GestureDetectorCompat(mRecyclerView.getContext(),
new ItemTouchHelperGestureListener());
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
mGestureDetectorCompat.onTouchEvent(e);
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
mGestureDetectorCompat.onTouchEvent(e);
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
public abstract void onItemClick(RecyclerView.ViewHolder viewHolder);
public abstract void onLongClick(RecyclerView.ViewHolder viewHolder);
private class ItemTouchHelperGestureListener extends GestureDetector.SimpleOnGestureListener{
@Override
public boolean onSingleTapUp(MotionEvent e) {
View childViewUnder = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
if (childViewUnder != null) {
RecyclerView.ViewHolder childViewHolder = mRecyclerView.getChildViewHolder(childViewUnder);
onItemClick(childViewHolder);
}
return true;
}
@Override
public void onLongPress(MotionEvent e) {
View childViewUnder = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
if (childViewUnder != null) {
RecyclerView.ViewHolder childViewHolder = mRecyclerView.getChildViewHolder(childViewUnder);
onLongClick(childViewHolder);
}
}
}
}
4. 长按拖动逻辑代码
/**
* Created on 2022/3/19 14:27
*
* @author Gong Youqiang
*/
public class RecyItemTouchHelperCallback extends ItemTouchHelper.Callback {
RecyclerView.Adapter mAdapter;
boolean isSwipeEnable;
boolean isFirstDragUnable;
public RecyItemTouchHelperCallback(RecyclerView.Adapter adapter) {
mAdapter = adapter;
isSwipeEnable = true;
isFirstDragUnable = false;
}
public RecyItemTouchHelperCallback(RecyclerView.Adapter adapter, boolean isSwipeEnable, boolean isFirstDragUnable) {
mAdapter = adapter;
this.isSwipeEnable = isSwipeEnable;
this.isFirstDragUnable = isFirstDragUnable;
}
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN |
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
int swipeFlags = 0;
return makeMovementFlags(dragFlags, swipeFlags);
} else {
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
return makeMovementFlags(dragFlags, swipeFlags);
}
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
int fromPosition = viewHolder.getAdapterPosition();
int toPosition = target.getAdapterPosition();
if (isFirstDragUnable && toPosition == 0) {
return false;
}
if (fromPosition < toPosition) {
for (int i = fromPosition; i < toPosition; i++) {
Collections.swap(((GirdAdapter) mAdapter).getDataList(), i, i + 1);
}
} else {
for (int i = fromPosition; i > toPosition; i--) {
Collections.swap(((GirdAdapter) mAdapter).getDataList(), i, i - 1);
}
}
mAdapter.notifyItemMoved(fromPosition, toPosition);
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
int adapterPosition = viewHolder.getAdapterPosition();
mAdapter.notifyItemRemoved(adapterPosition);
((GirdAdapter) mAdapter).getDataList().remove(adapterPosition);
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
}
super.onSelectedChanged(viewHolder, actionState);
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
viewHolder.itemView.setBackgroundColor(Color.WHITE);
}
@Override
public boolean isLongPressDragEnabled() {
return !isFirstDragUnable;
}
@Override
public boolean isItemViewSwipeEnabled() {
return isSwipeEnable;
}
}
5. 数据类
/**
* Created on 2022/3/19 14:58
*
* @author Gong Youqiang
*/
public class DataManager {
private static List<String> sStringList = Arrays.asList("苹果", "香蕉", "樱桃", "葡萄",
"芒果", "菠萝", "桔子", "梨子", "草莓");
public static final List<String> getData(int number) {
List<String> stringList = new ArrayList<>();
for (int i = 0; i < number; i++) {
stringList.add(sStringList.get(i % sStringList.size()));
}
return stringList;
}
}
推荐文献:
android开发游记:ItemTouchHelper 使用RecyclerView打造可拖拽的GridView
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。