需求分析

一个界面内两个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的更多相关文章

  1. 扩展BaseAdapter实现不存储列表项的ListView

    下面的实例将会通过扩展BaseAdapter来实现Adapter,扩展BaseAdapter可以取得对Adapter最大的控制权:程序要创建多个列表项,每个列表项的组件都由开发者来决定. 下面的布局文 ...

  2. Android 自学之列表视图ListView和ListActivity

    ListView是手机系统中使用非常广泛的一种组件,它以垂直列表的形式显示所有列表项. 创建ListView有两种方式: 直接使用ListView创建. 让Activity继承ListActivity ...

  3. android学习--视图列表(ListView和ListActivity)

    说明: 视图列表(ListView和ListActivity)与AutoComplete.Spinner类似,它们都须要一个供显示的列表项,能够须要借助于内容Adapter提供显示列表项 创建List ...

  4. Android零基础入门第39节:ListActivity和自定义列表项

    原文:Android零基础入门第39节:ListActivity和自定义列表项 相信通过前两期的学习,以及会开发最简单的一些列表界面了吧,那么本期接着来学习更多方法技巧. 一.使用ListActivi ...

  5. Android:控件ListView列表项与适配器结合使用

    Listview是用来展示一些重复性的数据用的,比如一些列表集合数据展示到手机,需要适配器作为载体获取数据,最后将数据填充到布局. ListView里面的每个子项Item可以使一个字符串,也可以是一个 ...

  6. Android开发 ListView(垂直滚动列表项视图)的简单使用

    效果图: 使用方法: 1.在布局文件中加入ListView控件: <?xml version="1.0" encoding="utf-8"?> &l ...

  7. Android学习系列(15)--App列表之游标ListView(索引ListView)

    游标ListView,提供索引标签,使用户能够快速定位列表项.      也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧.      一看图啥都懂了: 1. ...

  8. Android学习笔记(23):列表项的容器—AdapterView的子类们

    AdapterView的子类的子类ListView.GridView.Spinner.Gallery.AdapterViewFlipper和StackView都是作为容器使用,Adapter负责提供各 ...

  9. 自定义ListView适配器Adapter引用布局文件的情况下实现点击列表项时背景颜色为灰色

    listview控件设置适配器的时候,如果使用自定义的adapter,比如MyArrayAdapter extends ArrayAdapter<String> 如果listitem布局文 ...

随机推荐

  1. SDUT 2877:angry_birds_again_and_again

    angry_birds_again_and_again Time Limit: 2000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 The problems ...

  2. js格式化日期 年月日

    /**                     * 格式化日期                     * @param value                     * @param row  ...

  3. 使用存储过程来动态调用数据(SELECT)

    USE [MyTestDb] GO /****** Object: StoredProcedure [dbo].[PROC_GetChannelList] Script Date: 04/09/201 ...

  4. JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo

    OSI模型分层 OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七 ...

  5. Poj(2407),Greater New York Regional 2015 (D)

    题目链接:http://poj.org/problem?id=2407 Relatives Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  6. no branch 问题

    现象如下: lynn.feng:~/project/Git/M_MT6737_MP$ git branch -a* (no branch) a36_panasonic_l004 b36_panason ...

  7. NSIS学习记录の----NSIS插件调用

    我们都知道NSIS可以和C或者C++混合编程,方法是NSIS调用C或C++的动态库,那么如何调用呢? 首先我们来创建动态库: // add.cpp : 定义 DLL 应用程序的导出函数. #inclu ...

  8. 无边框窗体、用户控件、Timer控件

    一.无边框窗体1 最大化.最小化以及关闭按钮制作实际上就是更换点击前.指向时.点击时的图片 (1)将图片放在该文件夹的Debug中,获取图片的路径Application.StartupPath + & ...

  9. poj3349

    http://poj.org/problem?id=3349 每个雪花都有六个分支,用六个整数代表,这六个整数是从任意一个分支开始,朝顺时针或逆时针方向遍历得到的.输入多个雪花,判断是否有形状一致的雪 ...

  10. IIS7多域名绑定同一物理目录,设置不同默认文档的解决方案

    转载自 http://zzstudy.offcn.com/archives/6159 如何解决IIS7多域名绑定同一物理目录,设置不同的默认文档的问题? 因为在一个物理目录下只有一个web.confi ...