需求分析
一個界面內兩個ListView
我關注的欄目列表 上面的要長按后可拖動排序 點擊減號后列表項消失 下面列表增加一行 同時存儲相應字符串到本地作為標記
未關注欄目列表 普通ListView 點擊加號后 該列表項消失 上面列表增加一行
UI如下

上代碼
MainActivity
public class MainActivity extends Activity { SharedPreferences preferences; SharedPreferences.Editor editor; //關注列表相關 private ArrayList<Column> followList = new ArrayList<Column>(); private DragSortListView followListView; private FollowAdapter mFollowAdapter; //未關注列表相關 private ArrayList<Column> notFollowList = new ArrayList<Column>(); private ListView notFollowListView; private NotFollowAdapter mNotFollowAdapter; //增加一個臨時變量 保存所有的值 因為在后面列表為空時存在問題 private ArrayList<Column> allList = new ArrayList<Column>();; // 監聽器在手機拖動停下的時候觸發 private DragSortListView.DropListener onDrop = new DragSortListView.DropListener() { @Override public void drop(int from, int to) {// from to 分別表示 被拖動控件原位置 和目標位置 if (from != to) { Column column = (Column) mFollowAdapter.getItem(from);// 得到listview的適配器 mFollowAdapter.remove(from);// 在適配器中”原位置“的數據。 mFollowAdapter.insert(column, to);// 在目標位置中插入被拖動的控件。 } } }; // 刪除監聽器,點擊左邊差號就觸發。刪除item操作。 private DragSortListView.RemoveListener onRemove = new DragSortListView.RemoveListener() { @Override public void remove(int which) { //未關注列表增加一行 if (followList.size() != 0) { Column column = (Column) mFollowAdapter.getItem(which); editor.putBoolean(column.name, false); notFollowList.add(column); mNotFollowAdapter.notifyDataSetChanged(); }else { notFollowList.clear(); notFollowList.addAll(allList); mNotFollowAdapter.notifyDataSetChanged(); } //再刪除 mFollowAdapter.remove(which); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); // 設置無標題 setContentView(R.layout.activity_main); initView(); initData(); initSavaData(); followListView.setDropListener(onDrop); followListView.setRemoveListener(onRemove); mFollowAdapter = new FollowAdapter(MainActivity.this, followList); followListView.setAdapter(mFollowAdapter); followListView.setDragEnabled(true); // 設置是否可拖動。 mNotFollowAdapter = new NotFollowAdapter(MainActivity.this, notFollowList); notFollowListView.setAdapter(mNotFollowAdapter); } private void initView() { followListView = (DragSortListView) findViewById(R.id.follow_list); notFollowListView = (ListView) findViewById(R.id.not_follow_list); } private void initData() { // followList = NewsCategoryDao.getInstance(context).queryAll(); Column column1 = new Column(); column1.id = 1; column1.name = "國際足球"; followList.add(column1); allList.add(column1); Column column2 = new Column(); column2.id = 2; column2.name = "NBA"; followList.add(column2); allList.add(column2); Column column3 = new Column(); column3.id = 3; column3.name = "中國足球"; followList.add(column3); allList.add(column3); Column column4 = new Column(); column4.id = 4; column4.name = "中國藍球"; followList.add(column4); allList.add(column4); Column column5 = new Column(); column5.id = 5; column5.name = "視頻"; followList.add(column5); allList.add(column5); } private void initSavaData() { preferences = getSharedPreferences("column", MODE_WORLD_READABLE); editor = preferences.edit(); for (int i = 0; i < followList.size(); i++) { editor.putBoolean(followList.get(i).name, true); } editor.commit(); } public FollowAdapter getFollowAdapter() { return mFollowAdapter; } public ArrayList<Column> getFollowList() { return followList; } public NotFollowAdapter getNotFollowAdapter() { return mNotFollowAdapter; } public ArrayList<Column> getNotFollowList() { return notFollowList; } }
FollowAdapter
public class FollowAdapter extends BaseAdapter { private Context mContext; private LayoutInflater mInflater; private List<Column> followList; public FollowAdapter(Context context, List<Column> followList) { this.mContext = context; this.followList = followList; this.mInflater = LayoutInflater.from(context); } @Override public int getCount() { return followList.size(); } @Override public Object getItem(int arg0) { return followList.get(arg0); } @Override public long getItemId(int arg0) { return arg0; } @Override public View getView(int position, View convertView, ViewGroup parent) { Column column = (Column) getItem(position); ViewHolder viewHolder; if (convertView == null) { viewHolder = new ViewHolder(); convertView = mInflater.inflate( R.layout.follow_listview_item, null); viewHolder.columnName = (TextView) convertView .findViewById(R.id.columnName); viewHolder.click_remove = (ImageView) convertView .findViewById(R.id.click_remove); viewHolder.drag_handle = (ImageView) convertView .findViewById(R.id.drag_handle); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.columnName.setText(column.name); return convertView; } class ViewHolder { TextView columnName; //欄目名 ImageView click_remove; //刪除按鈕 ImageView drag_handle; //拖動條 } public void remove(int arg0) {// 刪除指定位置的item followList.remove(arg0); this.notifyDataSetChanged();// 不要忘記更改適配器對象的數據源 } public void insert(Column item, int arg0) {//在指定位置插入item followList.add(arg0, item); this.notifyDataSetChanged(); } }
NotFollowAdapter
public class NotFollowAdapter extends BaseAdapter{ private LayoutInflater mInflater; private Context mContext; private List<Column> notFollowList; private MainActivity mActivity; public NotFollowAdapter(Context context, List<Column> notFollowList) { this.mInflater = LayoutInflater.from(context); this.mContext = context; this.notFollowList = notFollowList; this.mActivity = (MainActivity)context; } @Override public int getCount() { return notFollowList.size(); } @Override public Object getItem(int position) { return notFollowList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { final Column column = (Column) getItem(position); ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.notfollow_listview_item, null); holder.columnName = (TextView) convertView.findViewById(R.id.columnName); holder.columnAdd = (ImageView) convertView.findViewById(R.id.columnAdd); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.columnName.setText(column.name); //添加按鈕點擊后 移除該行 上面列表增加一行 修改本地數據 final int tmp = position; holder.columnAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { notFollowList.remove(tmp); mActivity.getNotFollowAdapter().notifyDataSetChanged(); mActivity.getFollowList().add(column); mActivity.getFollowAdapter().notifyDataSetChanged(); //保存數據相關 SharedPreferences preferences = mContext.getSharedPreferences("column", Context.MODE_WORLD_READABLE); SharedPreferences.Editor editor = preferences.edit(); editor.putBoolean(column.name, false); } }); return convertView; } // ViewHolder靜態類 static class ViewHolder { TextView columnName; //欄目名 ImageView columnAdd; //添加按鈕 } }
Column
//欄目數據類 public class Column { public int id = 0; //l欄目ID號 public String name = ""; //欄目名稱 }
代碼見github https://github.com/huanyi0723/dragsort
