可拖動排序的ListView,拖動排序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;@Overrideprotected 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() {@Overridepublic 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代碼
<span style="font-size:14px;">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;}@Overridepublic int getCount() {return null == productInfoList ? 0 : productInfoList.size();}@Overridepublic Object getItem(int position) {return productInfoList.get(position);}@Overridepublic 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) {//將選中項之前的移動到選中項之後的位置,則選中項的索引需要發生變化,應該是選中項的位置-1mSelectPosition = mSelectPosition - 1;} else if (from > mSelectPosition && to < mSelectPosition) {//將選中項之後的項移動到選中項之前的位置,索引也需要變化,應該是選中項的位置+1mSelectPosition = mSelectPosition + 1;} else if ((from == mSelectPosition && from > to) || (from == mSelectPosition && from < to)) {//如果將選中項往選中項前面的方向拖,則選中項的索引也需要變化,應該是拖動到的位置mSelectPosition = to;} else if ((from < mSelectPosition && to == mSelectPosition)) {//將選中項之前的移動到當前選中項的位置,索引需要變化,選中項的索引應該是 選中項的值-1mSelectPosition = mSelectPosition - 1;} else if (from > mSelectPosition && to == mSelectPosition) {//將選中項之後的移動到當前項的位置,索引需要彎化,選中項的索引應該是選中項的值+1mSelectPosition = mSelectPosition + 1;}}productInfoList.add(to, productInfoBean);}notifyDataSetChanged();}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic void onClick(View v) {//1、刪除集合中的資料productInfoList.remove(position);//2、刪除伺服器端的資料mProductListAdapter1.notifyDataSetChanged();//mSelectPosition = -1;}}}</span>
四、源碼
:http://download.csdn.net/detail/xiogjie_67/8687813