当前位置: 首页 > 编程笔记 >

Android开发实现可拖动排序的ListView功能【附源码下载】

南宫保臣
2023-03-14
本文向大家介绍Android开发实现可拖动排序的ListView功能【附源码下载】,包括了Android开发实现可拖动排序的ListView功能【附源码下载】的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了Android开发实现可拖动排序的ListView功能。分享给大家供大家参考,具体如下:

一、上图

二、简述

1、需要实现的效果是长按右侧可拖动部分布局实现列表项的拖动排序
2、当点击列表项前面的单选按钮时,在该条目右侧显示删除图标,点击该图标删除当前条目。

三、实现思路

借助github上的开源代码drag-sort-listview-master加以改造。

四、主要源码展示

1、Activity代码

package com.gengducun.dslvdemo;
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import com.mobeta.android.dslv.DragSortListView;
public class MainActivity extends Activity {
 protected static final String TAG = "MainActivity";
 /**产品信息列表**/
 private ArrayList<ProductInfoBean> productInfoList;
 /**产品列表控件**/
 private DragSortListView mDslvProductList;
 /**产品信息列表*/
 private ProductListAdapter mProductListAdapter;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  mDslvProductList = (DragSortListView) findViewById(R.id.dslv_product_list);
  initProductList();
  mProductListAdapter = new ProductListAdapter(productInfoList, this);
  mDslvProductList.setAdapter(mProductListAdapter);
  mDslvProductList.setDropListener(onDrop);
  mDslvProductList.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
 }
 private DragSortListView.DropListener onDrop = new DragSortListView.DropListener() {
  @Override
  public void drop(int from, int to) {
   if (from != to) {
    ProductInfoBean item = (ProductInfoBean) mProductListAdapter.getItem(from);
    mProductListAdapter.remove(item);
    mProductListAdapter.insert(item,from, to);
    mDslvProductList.moveCheckState(from, to);
   }
  }
 };
 private void initProductList() {
  productInfoList = new ArrayList<ProductInfoBean>();
  ProductInfoBean productInfo1 = new ProductInfoBean("EURUSD1");
  ProductInfoBean productInfo2 = new ProductInfoBean("EURUSD2");
  ProductInfoBean productInfo3 = new ProductInfoBean("EURUSD3");
  ProductInfoBean productInfo4 = new ProductInfoBean("EURUSD4");
  ProductInfoBean productInfo5 = new ProductInfoBean("EURUSD5");
  ProductInfoBean productInfo6 = new ProductInfoBean("EURUSD6");
  ProductInfoBean productInfo7 = new ProductInfoBean("EURUSD7");
  productInfoList.add(productInfo1);
  productInfoList.add(productInfo2);
  productInfoList.add(productInfo3);
  productInfoList.add(productInfo4);
  productInfoList.add(productInfo5);
  productInfoList.add(productInfo6);
  productInfoList.add(productInfo7);
 }
}

2、Adapter代码

package com.gengducun.dslvdemo;
import java.util.ArrayList;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.TextView;
public class ProductListAdapter extends BaseAdapter {
 private static final String TAG = "ProductListAdapter1";
 /**产品信息列表*/
 private ArrayList<ProductInfoBean> productInfoList;
 /**上下文*/
 private Context mContext;
 /**布局加载器*/
 private LayoutInflater mInflater;
 /**布局缓存*/
 private ViewHolder mHolder;
 /**本类适配器对象**/
 private ProductListAdapter mProductListAdapter1;
 /**选中项位置**/
 private int mSelectPosition = -1;
 public ProductListAdapter(ArrayList<ProductInfoBean> productInfoList, Context context) {
  super();
  this.productInfoList = productInfoList;
  this.mContext = context;
  this.mInflater = LayoutInflater.from(context);
  this.mProductListAdapter1 = this;
 }
 @Override
 public int getCount() {
  return null == productInfoList ? 0 : productInfoList.size();
 }
 @Override
 public Object getItem(int position) {
  return productInfoList.get(position);
 }
 @Override
 public long getItemId(int position) {
  return position;
 }
 public int getmSelectPosition() {
  return mSelectPosition;
 }
 public void setmSelectPosition(int mSelectPosition) {
  this.mSelectPosition = mSelectPosition;
 }
 /**
  * 删除产品
  * @param productInfoBean
  */
 public void remove(ProductInfoBean productInfoBean) {
  synchronized (this) {
   productInfoList.remove(productInfoBean);
  }
  notifyDataSetChanged();
 }
 /**
  * 将产品移动到指定的位置
  * @param productInfoBean
  * @param from 移动之前的位置
  * @param to 移动完成之后,该产品所在的位置
  */
 public void insert(ProductInfoBean productInfoBean, int from, int to) {
  synchronized (this) {
   Log.i(TAG, "from=" + from + "  to =" + to);
   if (mSelectPosition != -1) {//有选中项的前提下
    if ((from < mSelectPosition && to < mSelectPosition) || (from > mSelectPosition && to > mSelectPosition)) {
     //在选中项之前的位置进行拖拉或者在选中项之后的区域拖拉,不会影响选中项
    } else if (from < mSelectPosition && to > mSelectPosition) {
     //将选中项之前的移动到选中项之后的位置,则选中项的索引需要发生变化,应该是选中项的位置-1
     mSelectPosition = mSelectPosition - 1;
    } else if (from > mSelectPosition && to < mSelectPosition) {
     //将选中项之后的项移动到选中项之前的位置,索引也需要变化,应该是选中项的位置+1
     mSelectPosition = mSelectPosition + 1;
    } else if ((from == mSelectPosition && from > to) || (from == mSelectPosition && from < to)) {
     //如果将选中项往选中项前面的方向拖,则选中项的索引也需要变化,应该是拖动到的位置
     mSelectPosition = to;
    } else if ((from < mSelectPosition && to == mSelectPosition)) {
     //将选中项之前的移动到当前选中项的位置,索引需要变化,选中项的索引应该是 选中项的值-1
     mSelectPosition = mSelectPosition - 1;
    } else if (from > mSelectPosition && to == mSelectPosition) {
     //将选中项之后的移动到当前项的位置,索引需要变化,选中项的索引应该是选中项的值+1
     mSelectPosition = mSelectPosition + 1;
    }
   }
   productInfoList.add(to, productInfoBean);
  }
  notifyDataSetChanged();
 }
 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  if (null == convertView) {
   convertView = mInflater.inflate(R.layout.list_item_product_list_1, null);
   mHolder = new ViewHolder();
   mHolder.rbSelect = (RadioButton) convertView.findViewById(R.id.rb_select);
   mHolder.tvPurductName = (TextView) convertView.findViewById(R.id.tv_product_name);
   mHolder.llDragLayout = (LinearLayout) convertView.findViewById(R.id.drag_handle);
   mHolder.ivDrag = (ImageView) convertView.findViewById(R.id.iv_drag);
   mHolder.ivDeleteProduct = (ImageView) convertView.findViewById(R.id.iv_product_delete);
   convertView.setTag(mHolder);
  } else {
   mHolder = (ViewHolder) convertView.getTag();
  }
  ProductInfoBean productInfoBean = productInfoList.get(position);
  if (null != productInfoBean) {
   //设置单选按钮的选中状态
   if (mSelectPosition == position) {
    mHolder.rbSelect.setChecked(true);
    mHolder.ivDrag.setVisibility(View.GONE);
    mHolder.ivDeleteProduct.setVisibility(View.VISIBLE);
    mHolder.ivDeleteProduct.setOnClickListener(new RemoveItemClickListener(mSelectPosition));
   } else {
    mHolder.rbSelect.setChecked(false);
    mHolder.ivDrag.setVisibility(View.VISIBLE);
    mHolder.ivDeleteProduct.setVisibility(View.GONE);
   }
   mHolder.rbSelect.setOnClickListener(new ProductClickListener(position));
   //设置产品名称
   if (null != productInfoBean.getProductName() && !("".equals(productInfoBean.getProductName()))) {
    mHolder.tvPurductName.setText(productInfoBean.getProductName());
   }
  }
  return convertView;
 }
 class ViewHolder {
  RadioButton rbSelect;
  TextView tvPurductName;
  LinearLayout llDragLayout;
  ImageView ivDrag;
  ImageView ivDeleteProduct;
 }
 /**
  * 单选按钮事件监听
  * @author Wilson
  */
 class ProductClickListener implements OnClickListener {
  private int position;
  public ProductClickListener(int position) {
   super();
   this.position = position;
  }
  @Override
  public void onClick(View v) {
   if (mSelectPosition == position) {
    mSelectPosition = -1;
   } else {
    mSelectPosition = position;
   }
   Log.i(TAG, "mSelectPosition=" + mSelectPosition + " position=" + position);
   mProductListAdapter1.notifyDataSetChanged();
  }
 }
 /**
  * 删除当前产品项监听事件
  */
 class RemoveItemClickListener implements OnClickListener {
  private int position;
  public RemoveItemClickListener(int position) {
   super();
   this.position = position;
  }
  @Override
  public void onClick(View v) {
   //1、删除集合中的数据
   productInfoList.remove(position);
   //2、删除服务器端的数据
   mProductListAdapter1.notifyDataSetChanged();
   //
   mSelectPosition = -1;
  }
 }
}

四、源码

完整实例代码点击此处本站下载

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android控件用法总结》、《Android开发入门与进阶教程》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android数据库操作技巧总结》及《Android资源操作技巧汇总

希望本文所述对大家Android程序设计有所帮助。

 类似资料:
  • 本文向大家介绍Android编程实现滑动开关组件功能【附源码下载】,包括了Android编程实现滑动开关组件功能【附源码下载】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android编程实现滑动开关组件功能。分享给大家供大家参考,具体如下: 由于Android并未提供滑动开关之类的组件,所以我们需要自己去实现一个自定义的视图组件来实现滑动开关效果。 这里有一个示例代码,它包括三个类:

  • 本文向大家介绍Dropzone.js实现文件拖拽上传功能(附源码下载),包括了Dropzone.js实现文件拖拽上传功能(附源码下载)的使用技巧和注意事项,需要的朋友参考一下 dropzone.js是一个开源的JavaScript库,提供 AJAX 异步文件上传功能,支持拖拽文件、支持最大文件大小、支持设置文件类型、支持预览上传结果,不依赖jQuery库。 效果演示      源码下载 使用Dro

  • 本文向大家介绍JS实现的简单拖拽购物车功能示例【附源码下载】,包括了JS实现的简单拖拽购物车功能示例【附源码下载】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS实现的简单拖拽购物车功能。分享给大家供大家参考,具体如下: 运行效果: 附:完整实例代码点击此处本站下载。 更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数据结构与算法技巧总结》、《Ja

  • 本文向大家介绍jQuery拖拽排序插件制作拖拽排序效果(附源码下载),包括了jQuery拖拽排序插件制作拖拽排序效果(附源码下载)的使用技巧和注意事项,需要的朋友参考一下 使用jquery拖拽排序插件制作拖拽排序效果是一款非常实用的鼠标拖拽布局插件。效果图如下: 效果演示         源码下载 html代码: 以上所述是小编给大家介绍的jQuery拖拽排序插件制作拖拽排序效果(附源码下载),希

  • 本文向大家介绍Android辅助功能实现自动抢红包(附源码),包括了Android辅助功能实现自动抢红包(附源码)的使用技巧和注意事项,需要的朋友参考一下 一、描述 最近看到同事有用抢红包的软件,就想看看抢红包的具体实现是如何的,所以了解了一下,有用辅助功能实现的,所以在下面的示例中会展示一个抢红包的小Demo,附带源码抢红包源码。 二、效果图 在桌面收到红包进行抢 在聊天页面收到口令红包 三、A

  • 本文向大家介绍微信小程序实现打开内置地图功能【附源码下载】,包括了微信小程序实现打开内置地图功能【附源码下载】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了微信小程序实现打开内置地图功能。分享给大家供大家参考,具体如下: 1、效果展示 2、关键代码 index.wxml布局文件代码 index.js逻辑文件代码 这里bindtap="openMap"绑定的openMap函数中调用wx.o