Reputation: 343
Listview with checkbox and CustomCursorAdapter
In ListActivity.java
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.list);
ListView listView = (ListView) findViewById(R.id.lists);
listView.setItemsCanFocus(false);
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
//create Cursor called cursor
listAdapter = new DetailListAdapter(this, cursor);
getLoaderManager().initLoader(LOADER_ID, null, this);
listView.setAdapter(listAdapter);
listView.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View v, int arg2, long arg3)
{
//want to call startactionmode with class implementing ListView.MultiChoiceModeListener
}
});
}
In DetailListAdapter.java
public class DetailListAdapter extends CursorAdapter
{
private Context context;
private ArrayList<Boolean> checked = new ArrayList<Boolean>();
private LayoutInflater mLayoutInflater;
public DetailListAdapter(Context context, Cursor c)
{
super(context, c);
mContext = context;
mLayoutInflater = LayoutInflater.from(context);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent)
{
View v = mLayoutInflater.inflate(R.layout.list_item, parent, false);
return v;
}
@Override
public void bindView(View v, Context context, Cursor c)
{
final View view = v;
final int position = c.getInt(0);
String data = c.getString(c.getColumnIndexOrThrow("DATA"));
/**
* Next set the name of the entry.
*/
TextView list_text = (TextView) view.findViewById(R.id.listitemtext);
CheckBox checkbox_text = (CheckBox) view.findViewById(R.id.listitemcheckbox);
list_text.setText(data);
checked.add(position - 1, false);
checkbox_text.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if (isChecked)
{
view.setBackgroundColor(Color.GRAY);
checked.set(position - 1, true);
} else
{
view.setBackgroundColor(Color.BLACK);
checked.set(position - 1, false);
}
}
});
checkbox_text.setChecked(!checkbox_text.isChecked());
}
}
The list row xml is,
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:descendantFocusability="blocksDescendants">
<CheckBox
android:id="@+id/check1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginTop="20dp"
android:focusable="false"
/>
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/check1"
android:layout_toRightOf="@+id/check1"
android:text="Medium Text"
android:textAppearance="?android:attr/textAppearanceMedium"
/>
<TextView
android:id="@+id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/text1"
android:layout_alignBottom="@+id/text1"
android:layout_marginLeft="20dp"
android:layout_toRightOf="@+id/text1"
android:text="Medium Text"
android:textAppearance="?android:attr/textAppearanceMedium"
/>
<TextView
android:id="@+id/text3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/text2"
android:layout_below="@+id/text1"
android:layout_toRightOf="@+id/check1"
android:text="Small Text"
android:textAppearance="?android:attr/textAppearanceSmall"
/>
</RelativeLayout>
When I click on list item in emulator, checkbox is checked and row turns into gray. But onitemclick is not getting called. I do have android:focusable="false" and android:focusableInTouchMode="false" on all items in layout which creates a row in list.
Upvotes: 0
Views: 1203
Reputation: 86948
I want checkbox to be checked and menu to be displayed at top containing actions that can be perfomed on that selected list item..
Two OnClickListeners cannot be called from one touch event. As you see, the first listener's onCheckedChanged()
method consumes the event preventing it from reaching the onItemClick()
method.
I recommend using a Checkable layout in your rows that will maintain the check state for you and changing your adapter's getView()
to set the appropriate background color on account of the view recycler.
(Post your XML in you question if you need help with this.)
Upvotes: 1