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布局文 ...
随机推荐
- SDUT 2877:angry_birds_again_and_again
angry_birds_again_and_again Time Limit: 2000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 The problems ...
- js格式化日期 年月日
/** * 格式化日期 * @param value * @param row ...
- 使用存储过程来动态调用数据(SELECT)
USE [MyTestDb] GO /****** Object: StoredProcedure [dbo].[PROC_GetChannelList] Script Date: 04/09/201 ...
- JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo
OSI模型分层 OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七 ...
- Poj(2407),Greater New York Regional 2015 (D)
题目链接:http://poj.org/problem?id=2407 Relatives Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- no branch 问题
现象如下: lynn.feng:~/project/Git/M_MT6737_MP$ git branch -a* (no branch) a36_panasonic_l004 b36_panason ...
- NSIS学习记录の----NSIS插件调用
我们都知道NSIS可以和C或者C++混合编程,方法是NSIS调用C或C++的动态库,那么如何调用呢? 首先我们来创建动态库: // add.cpp : 定义 DLL 应用程序的导出函数. #inclu ...
- 无边框窗体、用户控件、Timer控件
一.无边框窗体1 最大化.最小化以及关闭按钮制作实际上就是更换点击前.指向时.点击时的图片 (1)将图片放在该文件夹的Debug中,获取图片的路径Application.StartupPath + & ...
- poj3349
http://poj.org/problem?id=3349 每个雪花都有六个分支,用六个整数代表,这六个整数是从任意一个分支开始,朝顺时针或逆时针方向遍历得到的.输入多个雪花,判断是否有形状一致的雪 ...
- IIS7多域名绑定同一物理目录,设置不同默认文档的解决方案
转载自 http://zzstudy.offcn.com/archives/6159 如何解决IIS7多域名绑定同一物理目录,设置不同的默认文档的问题? 因为在一个物理目录下只有一个web.confi ...