您的位置:首页 > 移动开发 > Android开发

Android 可拖动列表项的ListView

2015-11-04 16:04 791 查看

需求分析

一个界面内两个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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: