实现一个可高度自定义的左右滑动的列表,可以使用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" />
``
安卓开发 如何实现一个可高度自定义的左右滑动的列表 并给出demo

原文地址: https://www.cveoy.top/t/topic/gBAT 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录