I have been using a ListView with each item a CheckableLinearLayout as defined in
I cannot check any row in the ListView, it does not even register the check in the UI. I do not believe there is a android:checkMark for the CheckableLinearLayout. Is it correct to nest the CheckedTextView inside my CheckableLinearLayout, would it be better if I used a CheckBox instead. Also, how can I put them in the ArrayList as soon as they are checked, instead of iterating over them in this manner.
This is my layout:
<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>
I have implemented the listActivity as follows:
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();
}
}
}
});
}
}
EDIT Trying a different approach to solve the problem by extending 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);
}
Then I have implemented an OnClickListener for the CheckBox:
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);
}
}
};
Now when I try to access the ArrayList that I am using,it throws an 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();
}
});
CheckableLinearLayoutis but if you're trying to choose multiple items from a list then you could accomplish it usingCheckBox. You could write a custom adapter for theListViewand in itsgetViewmethod attach anonCheckedChangedListenerto the item'sCheckBoxand add/remove that item from theArrayListof chosen items depending on the checked state of the item.CheckBoxif you don't detach it'sonCheckedChangeListenerthen when setting the checked state for it the previous listener will be called. to avoid this before reusing the view callSetonCheckedChangeListener(null)then set the checked state and then attach the new checkchange listener. If you want to make the List item clickable then you should add anonListItemClickListenerand in the root of your list item's layout addandroid:descendantFocusability="blocksDescendants"so that theCheckBoxdoesn't steal the focus from the list item.