安卓开发 如何实现一个可高度自定义的左右滑动的列表 并给出demo
实现一个可高度自定义的左右滑动的列表,可以使用RecyclerView和ItemTouchHelper来实现。
具体步骤如下:
1.创建一个RecyclerView,设置LayoutManager为LinearLayoutManager,并设置方向为水平方向。
2.创建一个自定义的Adapter,继承RecyclerView.Adapter,并实现其中的方法。
3.在Adapter中重写onCreateViewHolder方法,创建一个自定义的ViewHolder,用于显示每个列表项的内容。
4.在Adapter中重写onBindViewHolder方法,为ViewHolder设置数据和事件监听。
5.创建一个自定义的ItemTouchHelper.Callback,用于控制列表项的拖拽和滑动。
6.在ItemTouchHelper.Callback中重写onSwiped方法,用于控制列表项的左右滑动事件。
7.在RecyclerView的onTouchEvent方法中,通过ItemTouchHelper的回调方法处理列表项的拖拽和滑动事件。
8.在MainActivity中创建一个数据列表,并将其绑定到RecyclerView的Adapter中。
9.运行程序,测试列表项的拖拽和滑动事件是否正常。
下面是一个简单的示例代码:
MainActivity.java
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private MyListAdapter mAdapter;
private List<String> mDataList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
}
private void initData() {
mDataList = new ArrayList<>();
for (int i = 0; i < 20; i++) {
mDataList.add("Item " + i);
}
}
private void initView() {
mRecyclerView = findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
mAdapter = new MyListAdapter(mDataList);
mRecyclerView.setAdapter(mAdapter);
ItemTouchHelper.Callback callback = new MyItemTouchHelperCallback(mAdapter);
ItemTouchHelper touchHelper = new ItemTouchHelper(callback);
touchHelper.attachToRecyclerView(mRecyclerView);
}
}
MyListAdapter.java
public class MyListAdapter extends RecyclerView.Adapter<MyListAdapter.ViewHolder> implements MyItemTouchHelperCallback.ItemTouchHelperAdapter {
private List<String> mDataList;
public MyListAdapter(List<String> dataList) {
mDataList = dataList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
return new ViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.mTextView.setText(mDataList.get(position));
holder.mTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), "Click " + position, Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return mDataList.size();
}
@Override
public void onItemMove(int fromPosition, int toPosition) {
Collections.swap(mDataList, fromPosition, toPosition);
notifyItemMoved(fromPosition, toPosition);
}
@Override
public void onItemDismiss(int position) {
mDataList.remove(position);
notifyItemRemoved(position);
}
public static class ViewHolder extends RecyclerView.ViewHolder {
private TextView mTextView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
mTextView = itemView.findViewById(R.id.text_view);
}
}
}
MyItemTouchHelperCallback.java
public class MyItemTouchHelperCallback extends ItemTouchHelper.Callback {
private ItemTouchHelperAdapter mAdapter;
public MyItemTouchHelperCallback(ItemTouchHelperAdapter adapter) {
mAdapter = adapter;
}
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
int dragFlags = 0;
int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
return makeMovementFlags(dragFlags, swipeFlags);
}
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
mAdapter.onItemDismiss(viewHolder.getAdapterPosition());
}
public interface ItemTouchHelperAdapter {
void onItemMove(int fromPosition, int toPosition);
void onItemDismiss(int position);
}
}
item_layout.xml
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="16dp"
android:textSize="18sp" />
``
原文地址: https://www.cveoy.top/t/topic/gBAT 著作权归作者所有。请勿转载和采集!