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

时间: 2024-11-03 20:49:59

Android 可拖动列表项的ListView的相关文章

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

说明: 视图列表(ListView和ListActivity)与AutoComplete.Spinner类似,它们都需要一个供显示的列表项,可以需要借助于内容Adapter提供显示列表项 创建ListView有两种方式: (1)直接使用ListView进行创建 (2)Activity继承ListActivity ListView的常用XML属性 下面分别用两种方式创建ListView 方式一:直接使用ListView进行创建 (1)   main_activity.xml 下面布局两个listV

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

相信通过前两期的学习,以及会开发最简单的一些列表界面了吧,那么本期接着来学习更多方法技巧. 一.使用ListActivity 如果程序的窗口仅仅需要显示一个列表,则可以直接让Activity继承ListActivity来实现, ListActivity的子类无须调用setContentView()方法来显示某个界面,而是可以直接传入一个内容Adapter,ListActivity的子类就呈现出一个列表. 接下来通过一个简单的示例程序来学习基于ListActivity实现列表. 继续使用Widge

Android疑惑篇------------含有button按钮的ListView中,列表项无法获取焦点的问题

问题描述: 有过在ListView的列表项中添加按钮的朋友对这个问题一定不会陌生,我们的Demo在运行时,会出现这样的情况----------可以获取到列表项中的按钮点击事件,但是当我们想要获取整个列表项的点击事件时,就会发现此时点击列表项是没有任何反应的.为什么呢? 原因就是当在ListView中加入Button这类的有 “点击” 事件的widget时,ListView的itemclick事件将会被其它widget的click事件屏蔽,从而无法触发. 我们先来看一下列表项的XML文件 <?xm

Android ListView 列表项点击之后,保持背景颜色

项目中突然遇到这样的问题,一些消息类的界面,需要使用listview进行显示,正常的需求是刚开始进入消息显示界面的时候,列表项显示的都是全黑的,接着点击了某一个列表项之后,就要更换成白色,并且保持白色的显示,剩下的仍旧为黑色的,一开始就有点走进了死胡同,使用selector结合shape来定义选中.未选中.点击或者点击之后的背景显示,实例如下: </pre><p></p><pre name="code" class="html&quo

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

游标ListView,提供索引标签,使用户能够快速定位列表项.      也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧.      一看图啥都懂了: 1.游标(Fast scroll thumb)      就是右边的那个拖动的方块,这个非常的简单: 1 2 3 4 5 <ListView     android:id="@+id/tweaked_list"     android:layout_width="fill_pa

Android学习系列(17)--App列表之圆角ListView(续)

http://www.cnblogs.com/qianxudetianxia/archive/2011/09/19/2068760.html 本来这篇文章想并到上篇Android学习系列(16)--App列表之圆角ListView中的,但是若是如此就让大家错过一篇新的好的文章,着实可惜.上篇中我们使用shape,corners,gradient实现了一个渐变的圆角效果,但是在完文之后的实践中,我发现有时效果不甚满意,选中和放手的事件监听没有去正确的判断,然后渐变效果也比较单一,性能也觉得不是很快

android学习笔记——利用BaseAdapter生成40个列表项

RT: main.xml ? 1 2 3 4 5 6 7 8 9 10 11 12 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"               android:orientation="vertical"        

ListView列表项

方法,在xml文件中添加一个ListView,然后在MainActivity中 private ListView listView; private ArrayAdapter<String> arr_adapter; listView = (ListView) findViewById(R.id.listView1); String[] arr_data = {"明明","丽媛", "彭辉", "倩倩", &quo

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

listview控件设置适配器的时候,如果使用自定义的adapter,比如MyArrayAdapter extends ArrayAdapter<String> 如果listitem布局文件不做任何处理的话,点击列表项的时候不会出现背景色灰色的现象. 实现思路是:在listitem布局文件中为该布局文件中的父控件:LinearLayout,设置android:background="@drawable/listitemclickseletor" 其中listitemclic