我一直在使用 a中定义的ListView
每个项目 aCheckableLinearLayout
我无法检查 中的任何行ListView
,它甚至没有在 UI 中注册检查。我不相信有一个android:checkMark
for CheckableLinearLayout
。CheckedTextView
嵌套在 my 内部是否正确,CheckableLinearLayout
如果我使用 aCheckBox
代替会更好。另外,如何在ArrayList
检查它们后立即将它们放入其中,而不是以这种方式迭代它们。
这是我的布局:
<com.example.deltest.CheckableLinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<CheckedTextView
android:id="@android:id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/txt_a"
/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/txt_b"
/>
</com.example.deltest.CheckableLinearLayout>
我已经实现了 listActivity 如下:
public class DeleteList extends ListActivity
{
ArrayList<Integer> idList=new ArrayList<Integer>();
Cursor c;
Handler handler;
static final int WHAT=0;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
final TumblrDB db=new TumblrDB(this);
c=db.query();
startManagingCursor(c);
handler=new Handler();
View v=getLayoutInflater().inflate(R.layout.layout_header, null,false);
getListView().addHeaderView(v);
getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
SimpleCursorAdapter adapter=new SimpleCursorAdapter(this,R.layout.layout_del,c,new String[] {TumblrDB.DATE,TumblrDB.DESC},new int[]{R.id.txt_a,R.id.txt_b});
getListView().setAdapter(adapter);
if(handler.hasMessages(WHAT))
{
c=db.query();
((SimpleCursorAdapter)getListView().getAdapter()).swapCursor(c);
}
Button btn_del=(Button)v.findViewById(R.id.btn_del);
btn_del.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
int count=getListView().getCount();
SparseBooleanArray sparseBooleanArray=getListView().getCheckedItemPositions();
for(int i=0;i<count;i++)
{
if(sparseBooleanArray.get(i))
{
c.moveToPosition(i);
int _id=c.getInt(c.getColumnIndex(TumblrDB._ID));
Log.d("DeleteList", "The id has been added "+_id);
idList.add(_id);
new Thread()
{
public void run()
{
for(int i:idList)
{
db.delete(i);
Log.d("DeleteList", "The id has been deleted "+i);
handler.sendEmptyMessage(WHAT);
}
}
}.start();
}
}
}
});
}
}
编辑通过扩展 SimpleCursorAdapter 尝试不同的方法来解决问题:
if(row==null)
{
row=inflater.inflate(layout, null, false);
holder=new ViewHolder(row,position);
row.setTag(holder);
holder.check_del.setTag(position);
}
else
{
holder=(ViewHolder)row.getTag();
holder.check_del.setOnClickListener(null);
holder.check_del.setTag(position);
if(hitList.get(position))
holder.check_del.setChecked(true);
else
holder.check_del.setChecked(false);
}
然后我为 CheckBox 实现了一个 OnClickListener:
OnClickListener cbl=new OnClickListener(){
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
int position=(Integer)view.getTag();
Log.d("CustomCursorAdapter", "The checkbox at postion "+position+" has been clicked");
if(((CheckBox)view).isChecked())
{
hitList.set(position, true);
}
else
{
hitList.set(position, false);
}
}
};
现在,当我尝试访问正在使用的 ArrayList 时,它会引发 ArrayOutOfBoundsException:
btn_del.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
new Thread()
{
public void run()
{
int count=lv.getCount();
for(int i=0;i<count;i++)
{
if(adapter.hitList.get(i))
{
db.delete(c.getInt(c.getColumnIndex(TumblrDB._ID)));
}
}
}
}.start();
adapter.notifyDataSetChanged();
}
});