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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM