主体思想,把要删除的位置放入List中进行保存,之后根据list进行删除。
实现了全选,反选删除功能。
MainActivity
public class MainActivity extends Activity {
ListView show;
List<String> datas = new ArrayList<String>();
ListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show = (ListView)findViewById(R.id.showList);
//ListView刷新数据
refresh();
}
private void refresh() {
datas.clear();
for(int i = 0; i < 30; i++)
{
datas.add("数据" + i);
}
adapter = new ListAdapter(this,datas);
show.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch(item.getItemId())
{
//重新加载数据
case R.id.action_settings:
refresh();
break;
//删除数据
case R.id.action_delete:
adapter.update();
break;
//全选
case R.id.action_selectAll:
adapter.selectAll();
break;
//反选
case R.id.action_invert:
adapter.invert();
break;
}
return true;
}
自定义adapter之ListAdapter
public class ListAdapter extends BaseAdapter
{
LayoutInflater inflater;
List<String> AdapterDatas;
List<Integer> checkState;
public ListAdapter(Context context,List<String> datas)
{
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
AdapterDatas = datas;
checkState = new ArrayList<Integer>();
}
@Override
public int getCount() {
return AdapterDatas.size();
}
@Override
public Object getItem(int position) {
return AdapterDatas.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
Holder holder = new Holder();
if(convertView == null)
{
convertView = inflater.inflate(R.layout.main_item, null);
holder.tv = (TextView)convertView.findViewById(R.id.item_title);
holder.check = (CheckBox)convertView.findViewById(R.id.check);
convertView.setTag(holder);
System.out.println("新的View的位置是:" + position);
}
else
{
holder = (Holder) convertView.getTag();
System.out.println("旧的View的位置是:" + position);
}
holder.tv.setText(AdapterDatas.get(position));
if(checkState.contains(position))
{
holder.check.setChecked(true);
}
else
{
holder.check.setChecked(false);
}
holder.check.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
CheckBox check = (CheckBox)v;
if(check.isChecked())
{
checkState.add(position);
}
else
{
checkState.remove((Integer)position);
}
}
});
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(inflater.getContext(), "" + position, Toast.LENGTH_SHORT).show();
}
});
return convertView;
}
//删除选择项
public void update()
{
//根据位置删除list中元素时,由于删除一个元素后面的元素的
//位置也相应的改变,所以先进行排序,从list后面开始删除
Collections.sort(checkState);
for(int i = checkState.size()-1 ;i >= 0;i--)
{
AdapterDatas.remove((int)checkState.get(i));
}
checkState.clear();
notifyDataSetChanged();
}
//选择全部
public void selectAll()
{
checkState.clear();
for(int i = 0;i < AdapterDatas.size();i++)
{
checkState.add((Integer)i);
}
notifyDataSetChanged();
}
//反选
public void invert()
{
for(int i = 0;i < AdapterDatas.size();i++)
{
if(checkState.contains((Integer)i))
{
checkState.remove((Integer)i);
}
else
{
checkState.add((Integer)i);
}
}
notifyDataSetChanged();
}
public class Holder
{
TextView tv;
CheckBox check;
}
}
一个卡了挺久的问题:
本来列表项中的checkBox的事件是setOnCheckedChangeListener这个事件由checkBox的点击状态改变触发。
逻辑上是没有问题的。关键是每当隐藏一个列表项时,就会触发这个方法(可能是android的默认机制的原因吧),
从而无缘无故的执行setOnCheckedChangeListener事件中的语句,导致了错误的结果。
无奈只有改变了触发事件改成了setOnClickListener这种单击的模式。