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

posted @ 2015-11-04 16:04  幻奕  阅读(3433)  评论(0编辑  收藏  举报