0

チェックボックスと CustomCursorAdapter を含むリストビュー

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
        }

    });

}

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());
    }
}

リスト行xmlは、

<?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>

エミュレーターでリスト項目をクリックすると、チェックボックスがオンになり、行が灰色になります。しかし、onitemclick は呼び出されません。リストに行を作成するレイアウト内のすべてのアイテムに android:focusable="false" と android:focusableInTouchMode="false" があります。

4

1 に答える 1

1

チェックボックスをオンにして、選択したリストアイテムで実行できるアクションを含むメニューを上部に表示したい。

1つのタッチイベントから2つのOnClickListenerを呼び出すことはできません。ご覧のとおり、最初のリスナーの onCheckedChanged()メソッドはイベントを消費して、メソッドに到達できないようにしonItemClick()ます。

チェック状態を維持するチェック可能なレイアウトを行で使用しgetView()、ビューリサイクラーのために適切な背景色を設定するようにアダプターを変更することをお勧めします。

(これについてサポートが必要な場合は、質問にXMLを投稿してください。)

于 2012-11-16T18:01:25.887 に答える