web-dev-qa-db-ja.com

カスタムビューの複数選択リスト?

私は例を見ましたcom.example.Android.apis.view.List11 ApiDemosから。その例では、各行はビューを取りますAndroid.R.simple_list_item_multiple_choice。そのような各ビューには、TextViewCheckBoxがあります。

ここで、各ビューに2つのTextViewsと1つのCheckBoxが必要です。これはListの例に多少似ています。次のようなカスタムレイアウトファイル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>
_

次に、ActivityonCreate()で、次のようにします。

_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の例では、アイテムの行をクリックするだけです。

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

34
Phil

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

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

17

Rahul Gargの答えは、モデルデータに応じていくつかの行をチェックしたい場合、リストを初めてロードするときに役立ちますが、その後、自分でチェック/チェック解除イベントを処理する必要があります。

ListActivityonListItemCLick()をオーバーライドして、行をチェック/チェック解除できます。

_@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_に設定しないでください。関数を呼び出すときに奇妙なことが起こります。

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

_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
   }
}
_
7
JVitela

解決策は、クリック可能なインターフェイスを実装するカスタムビューを作成することです。

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>

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

5
Adorjan Princz

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

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

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

CheckBoxAndroid:id値は"@Android:id/text1"そして、それが役立つかどうかを確認します。これは、Android for CheckedTextView for simple_list_item_multiple_choice

5
CommonsWare
1
russellhoff

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

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;
    }
}
1
Adorjan Princz

なんらかのトリックで可能です

メソッドの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;
    }

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

1
Rahul Garg

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

0
Pritam

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

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

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

そして最後に@RahulとJVitella:

状況は、リストアイテムのCheckBoxが、リストアイテム自体とは独立してクリックおよびチェック可能でなければならないということです。したがって、解決策は、上記で説明したとおりです。

0
Yar