anonymous
anonymous

Reputation: 343

OnItemClick not responding for listview with checkbox and customcursoradapter

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

Answers (1)

Sam
Sam

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

Related Questions