Android 可拖动列表项的ListView
需求分析
一个界面内两个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
Android 可拖动列表项的ListView的更多相关文章
- 扩展BaseAdapter实现不存储列表项的ListView
下面的实例将会通过扩展BaseAdapter来实现Adapter,扩展BaseAdapter可以取得对Adapter最大的控制权:程序要创建多个列表项,每个列表项的组件都由开发者来决定. 下面的布局文 ...
- Android 自学之列表视图ListView和ListActivity
ListView是手机系统中使用非常广泛的一种组件,它以垂直列表的形式显示所有列表项. 创建ListView有两种方式: 直接使用ListView创建. 让Activity继承ListActivity ...
- android学习--视图列表(ListView和ListActivity)
说明: 视图列表(ListView和ListActivity)与AutoComplete.Spinner类似,它们都须要一个供显示的列表项,能够须要借助于内容Adapter提供显示列表项 创建List ...
- Android零基础入门第39节:ListActivity和自定义列表项
原文:Android零基础入门第39节:ListActivity和自定义列表项 相信通过前两期的学习,以及会开发最简单的一些列表界面了吧,那么本期接着来学习更多方法技巧. 一.使用ListActivi ...
- Android:控件ListView列表项与适配器结合使用
Listview是用来展示一些重复性的数据用的,比如一些列表集合数据展示到手机,需要适配器作为载体获取数据,最后将数据填充到布局. ListView里面的每个子项Item可以使一个字符串,也可以是一个 ...
- Android开发 ListView(垂直滚动列表项视图)的简单使用
效果图: 使用方法: 1.在布局文件中加入ListView控件: <?xml version="1.0" encoding="utf-8"?> &l ...
- Android学习系列(15)--App列表之游标ListView(索引ListView)
游标ListView,提供索引标签,使用户能够快速定位列表项. 也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧. 一看图啥都懂了: 1. ...
- Android学习笔记(23):列表项的容器—AdapterView的子类们
AdapterView的子类的子类ListView.GridView.Spinner.Gallery.AdapterViewFlipper和StackView都是作为容器使用,Adapter负责提供各 ...
- 自定义ListView适配器Adapter引用布局文件的情况下实现点击列表项时背景颜色为灰色
listview控件设置适配器的时候,如果使用自定义的adapter,比如MyArrayAdapter extends ArrayAdapter<String> 如果listitem布局文 ...
随机推荐
- 发现数据库错误模式(AppScan扫描结果)
最近工作要求解决下web的项目的漏洞问题,扫描漏洞是用的AppScan工具,其中此篇文章是关于发现数据库错误模式问题的.下面就把这块东西分享出来. 原创文章,转载请注明 --------------- ...
- acdream 1093 女神的正多面体
http://acdream.info/problem?pid=1093 女神的正多面体 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 12 ...
- jquery.util.easyui.dialog
(function ($) { var $parent = parent.$; //获取弹出窗口数据集合 function getDialogs() { var dialogs = $parent(& ...
- 2016年12月11日 星期日 --出埃及记 Exodus 21:6
2016年12月11日 星期日 --出埃及记 Exodus 21:6 then his master must take him before the judges. He shall take hi ...
- php获取本周和上周的开始日期和结束日期
<?php header('Content-type: text/html; charset=utf-8'); $date=date('Y-m-d'); //当前日期 $first=1; //$ ...
- Android Handler Message总结
http://blog.csdn.net/caesardadi/article/details/8473777 当应用程序启动时,会开启一个主线程(也就是UI线程),由她来管理UI,监听用户点击,来响 ...
- 苹果Xcode帮助文档阅读指南
文档导读 https://developer.apple.com/legacy/library/navigation/ 前面我们讲Xcode的文档结构是在介绍如何能够快速定位到你要找的内容.但是很多人 ...
- 将XML文件中的内容转换为Json对象
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xml;u ...
- FCKeditor使用方法技术详解
转载自 http://www.cnblogs.com/cchyao/archive/2010/07/01/1769204.html 1.概述 FCKeditor是目前最优秀的可见即可得网页编辑器之一, ...
- Cheatsheet: 2013 09.10 ~ 09.21
.NET Lucene.Net – Custom Synonym Analyzer Using FiddlerCore to Capture Streaming Audio Immutable col ...