34

ApiDemos のcom.example.android.apis.view.List11の例を見てきました。この例では、各行はビューandroid.R.simple_list_item_multiple_choiceを取ります。このような各ビューにはTextViewと がありCheckBoxます。

TextViewここで、各ビューに 2と 1を持たせたいと思います。List3の例CheckBoxと似ています。次のようなカスタム レイアウト ファイル row.xml を作成してみました。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <CheckBox
        android:id="@+id/checkbox"
        android:layout_alignParentRight="true"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent" />
    <TextView
        android:id="@+id/text_name"
        android:textSize="13px"
        android:textStyle="bold"
        android:layout_toLeftOf="@id/checkbox"
        android:layout_alignParentLeft="true"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/text_phone"
        android:textSize="9px"
        android:layout_toLeftOf="@id/checkbox"
        android:layout_below="@id/text_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" /> 
</RelativeLayout>

次に、Activityでは、次のonCreate()ようにします。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Query the contacts
    mCursor = getContentResolver().query(Phones.CONTENT_URI, null, null, null, null);
    startManagingCursor(mCursor);

    ListAdapter adapter = new SimpleCursorAdapter(this,
            R.layout.row,
            mCursor, 
            new String[] { Phones.NAME, Phones.NUMBER}, 
            new int[] { R.id.text_name, R.id.text_phone });
    setListAdapter(adapter);
    getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
}

結果は私が望むもののように見えますが、リストはどの項目が選択されているかを認識していないようです。また、 を正確にクリックする必要がありますCheckBox。List11 の例では、項目の行をクリックするだけです。

では、各行のカスタム ビューで複数選択リストを作成するには、どうすればよいでしょうか? どうもありがとう。

4

9 に答える 9

17

インターフェイスRelativeLayoutを実装する独自のものを作成し、または への参照(複数選択モードの場合はリスト) を用意する必要があります。CheckableCheckBoxCheckedTextView

この投稿を見てください: http://www.marvinlabs.com/2010/10/29/custom-listview-ability-check-items/

于 2011-02-17T17:32:28.103 に答える
7

Rahul Garg の回答は、モデル データに応じていくつかの行をチェックする必要がある場合、リストが初めて読み込まれる場合に適していますが、その後は自分でチェック/チェック解除イベントを処理する必要があります。

の をオーバーライドしてonListItemCLick()ListActivity行をチェック/チェック解除できます

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    ViewGroup row = (ViewGroup)v;
 CheckBox check = (CheckBox) row.findViewById(R.id.checkbox);            
    check.toggle();
}

その場合、関数を呼び出すときにおかしなことになるので、ListViewをに設定しないでください。CHOICE_MODE_MULTIPLE

チェックされた行のリストを取得するには、メソッドを自分で実装する必要があり、 を呼び出しgetCheckItemIds()てもListView機能しません。

ListView l = getListView();
int count = l.getCount();
for(int i=0; i<count; ++i) {
   ViewGroup row = (ViewGroup)l.getChildAt(i);
   CheckBox check = (Checked) row.findViewById(R.id.ck1);
   if( check.isChecked() ) {
      // do something
   }
}
于 2011-01-19T14:45:26.690 に答える
5

解決策は、Clickableインターフェイスを実装するカスタムビューを作成することです。

public class OneLineCheckableListItem extends LinearLayout implements Checkable {

    public OneLineCheckableListItem(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    private boolean checked;


    @Override
    public boolean isChecked() {
        return checked;
    }

    @Override
    public void setChecked(boolean checked) {
        this.checked = checked; 

        ImageView iv = (ImageView) findViewById(R.id.SelectImageView);
        iv.setImageResource(checked ? R.drawable.button_up : R.drawable.button_down);
    }

    @Override
    public void toggle() {
        this.checked = !this.checked;
    }
}

そして、新しいウィジェットを使用してリストアイテムのカスタムレイアウトを作成します。

<?xml version="1.0" encoding="utf-8"?>
<ax.wordster.OneLineCheckableListItem xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="4dp"
    android:background="@drawable/selector_listitem"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/SelectImageView"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:src="@drawable/button_friends_down" />

    <TextView
        android:id="@+id/ItemTextView"
        android:layout_width="fill_parent"
        android:layout_height="60dp"
        android:gravity="center"
        android:text="@string/___"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="@color/text_item" />

</ax.wordster.OneLineCheckableListItem>

次に、上記のレイアウトを使用して新しいカスタムアダプタを作成します。

于 2013-02-08T19:48:01.107 に答える
5

このような各ビューには、TextView と CheckBox があります。

いいえ、そうではありません。がありCheckedTextViewます。

では、各行のカスタム ビューで複数選択リストを作成するには、どうすればよいでしょうか?

CheckBox android:id値を にしてみて、"@android:id/text1"それが役立つかどうかを確認してください。これは、Android でCheckedTextViewin に使用される IDsimple_list_item_multiple_choiceです。

于 2010-04-16T12:49:22.860 に答える
1

カスタム レイアウトをカスタム チェックボックスとして機能させる簡単な例:

private class FriendsAdapter extends ArrayAdapter<WordsterUser> {
    private Context context;

    public FriendsAdapter(Context context) {
        super(context, R.layout.listitem_oneline);

        this.context = context;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final int pos = position;

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View rv = inflater.inflate(R.layout.listitem_oneline, parent, false);
        rv.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                boolean checked = friendsListView.isItemChecked(pos); 
                friendsListView.setItemChecked(pos, !checked);
            }
        });

        WordsterUser u = getItem(position);

        TextView itw = (TextView) rv.findViewById(R.id.ItemTextView);
        itw.setText(u.userName + " (" + u.loginName + ")");

        ImageView iv = (ImageView) rv.findViewById(R.id.SelectButton);

        if (friendsListView.isItemChecked(position)) {
            iv.setImageResource(R.drawable.downbutton);
        } else {
            iv.setImageResource(R.drawable.upbutton);
        }

        return rv;
    }
}
于 2013-02-08T17:41:21.640 に答える
1

ちょっとした工夫で可能

メソッドの ListActivtyClass で

protected void onListItemClick(ListView l, View v, int position, long id) {
//just set
<your_model>.setSelected(true);
}

今すぐあなたのカスタムアダプタに

public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(textViewResourceId, parent, false);
        }       
        if (<your_model>.isSelected()) {
            convertView.setBackgroundColor(Color.BLUE);
        } else {
            convertView.setBackgroundColor(Color.BLACK);
        }
        return convertView;
    }

このようにして、アイテムがリストで選択されたときにアダプターのビューをカスタマイズできます。

于 2010-11-22T17:05:48.567 に答える
0

プリタムの答えが正しいことを確認したい。onClickListener各リストの項目にが必要です(アダプターの で定義しますgetView())。

onClickListener()アイテムごとに新しい を作成するか、アダプタに実装させることができますonClickListener()。この場合、リスナーがどのアイテムを操作しているかを知るために、アイテムにタグを付ける必要があります。

リストに依存するonItemClickListener()-誰かが別のスレッドでアドバイスしたように-CheckBoxクリックイベントをインターセプトするため、リストはそれを取得しないため、機能しません。

そして最後に @Rahul と JVitella:

状況としてはCheckBox、リスト アイテムの は、リスト アイテム自体から独立してクリックおよびチェック可能である必要があります。したがって、解決策は先ほど説明したとおりです。

于 2011-02-09T15:51:34.497 に答える
0

解決策を手に入れました... getView()で変換されたビューを返しながら、アダプター自体の各ビューにリスナーを追加することにより、ビュー(行のカスタムレイアウトのチェックボックスなど)のクリックを取得できます。リスト固有の情報を取得する場合は、リスト オブジェクトの参照を渡す必要がある場合があります。行IDのように。

于 2010-12-20T13:35:11.483 に答える