需求分析

一个界面内两个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. Python下科学计算包numpy和SciPy的安装

    转载自:http://blog.sina.com.cn/s/blog_62dfdc740101aoo6.html Python下大多数工具包的安装都很简单,只需要执行 “python setup.py ...

  2. 20150618_Andriod _KSOAP2_多线程

    参考地址:http://blog.csdn.net/long704480904/article/details/8636734 webService:基于SOAP协议的远程调用标准,通过webServ ...

  3. Balance

    Balance Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 11947 Accepted: 7464 Description ...

  4. Sqlite查询时间段内的数据问题解决!

    最近搞Sqlite本地查询,需求为查询某时间段内的数据,在SQL中我们都知道为: select * from tblName where rDate Between '2008-6-10' and   ...

  5. 使用label在winfrom中添加分割线

    1.水平分隔线:GroupBox2. 水平,垂直分隔: Lable (AutoSize = false, BorderStyle= Fixed3D , 还要调整Size的大小 水平调整Height = ...

  6. U3D刚体测试2(ForceMode,AddForce,RelativeAddForce)

    摘自圣典的一段翻译: ForceAdd a continuous force to the rigidbody, using its mass.添加一个可持续力到刚体,使用它的质量.Accelerat ...

  7. UVa 213,World Finals 1991,信息解码

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  8. 测试post

    http://www.atool.org/httptest.php 这里也可以测试 火狐有插件:HttpRequester Chrome有插件:Postman

  9. javascript中set与get方法详解

    其中get与set的使用方法: 1.get与set是方法,因为是方法,所以可以进行判断. 2.get是得到 一般是要返回的   set 是设置 不用返回 3.如果调用对象内部的属性约定的命名方式是_a ...

  10. Java多个数字求和输出

    设计思想: 首先为了能够输入数字,先引入一个类import java.util.Scanner;因为是多个数字求和,所以为了方便声明一个数组double[] num;再声明一个变量int number ...