Frage Multiple-Choice-Liste mit benutzerdefinierter Ansicht?


Ich habe ein Beispiel gesehen com.beispiel.android.apis.view.List11 von ApiDemos. In diesem Beispiel übernimmt jede Zeile die Ansicht android.R.simple_list_item_multiple_choice. Jede dieser Ansichten hat eine TextView und ein CheckBox.

Jetzt möchte ich, dass jede Ansicht 2 hat TextViews und 1 CheckBox, etwas ähnlich dem Liste3 Beispiel. Ich habe versucht, eine benutzerdefinierte Layout-Datei row.xml wie folgt zu erstellen:

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

Dann in Activityist es onCreate()Ich mag das:

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

Das Ergebnis sieht so aus, wie ich es möchte, aber es sieht so aus, als ob die Liste nicht weiß, welches Element ausgewählt ist. Außerdem muss ich genau auf die klicken CheckBox. Im List11-Beispiel muss ich nur auf die Artikelzeile klicken.

Was muss ich tun, um eine Mehrfachauswahlliste mit meiner benutzerdefinierten Ansicht für jede Zeile zu erstellen? Danke vielmals.


34
2018-04-16 10:17


Ursprung


Antworten:


Du musst dein eigenes machen RelativeLayout das implementiert die Checkable Schnittstelle und haben einen Verweis auf die CheckBox oder zum CheckedTextView (oder eine Liste, wenn es Multiple-Choice-Modus ist).

Sieh dir diesen Beitrag an: http://www.marvinlabs.com/2010/10/29/custom-listview-ability-check-items/


17
2018-02-17 17:32



Die Antwort von Rahul Garg ist zum ersten Mal, wenn die Liste geladen wird, gut, wenn Sie möchten, dass einige Zeilen abhängig von den Modelldaten überprüft werden, aber danach müssen Sie die Check / Uncheck-Ereignisse selbst behandeln.

Sie können die onListItemCLick() des ListActivity Aktivieren / Deaktivieren der Zeilen

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

Wenn Sie dies tun, stellen Sie nicht die ListView zu CHOICE_MODE_MULTIPLE, weil es seltsame Dinge beim Aufruf der Funktion macht.

Um die Liste der geprüften Zeilen abzurufen, müssen Sie eine Methode selbst implementieren und aufrufen getCheckItemIds() auf der ListView funktioniert nicht:

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
2018-01-19 14:45



Jede dieser Ansichten hat einen TextView und einen   CheckBox.

Nein, tut es nicht. Es hat ein CheckedTextView.

Also was muss ich tun um ein zu machen   Multiple-Choice-Liste mit meiner Gewohnheit   Ansicht für jede Reihe?

Versuch das zu machen CheckBox  android:id Wert sein "@android:id/text1" und sehen, ob das hilft. Das ist die von Android für die CheckedTextView im simple_list_item_multiple_choice.


5
2018-04-16 12:49



Die Lösung besteht darin, eine benutzerdefinierte Ansicht zu erstellen, die die Clickable-Schnittstelle implementiert.

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

Erstellen Sie mit dem neuen Widget ein benutzerdefiniertes Layout für die Listenelemente.

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

Erstellen Sie dann einen neuen benutzerdefinierten Adapter mit dem obigen Layout.


5
2018-02-08 19:48



Es ist durch einen Trick möglich

in Ihrer ListActivityClass in Methode

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

Jetzt in dir benutzerdefinierter Adapter

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

Auf diese Weise können Sie die Ansicht im Adapter anpassen, wenn das Element in der Liste ausgewählt ist.


1
2017-11-22 17:05



Einfaches Beispiel, wie ein benutzerdefiniertes Layout als benutzerdefiniertes Kontrollkästchen verwendet werden kann:

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
2018-02-08 17:41



Ich fand es sehr nützlich, diesen kleinen Code: http://alvinalexander.com/java/jwarehouse/apps-for-roid/RingsExtended/src/com/example/android/rings_extended/CheckableRelativeLayout.java.shtml 

Es ist eine großartige Ergänzung zu @ ferdy182 http://www.marvinlabs.com/2010/10/29/custom-listview-ability-check-items/ Inhalt.


1
2017-12-22 10:33



Die Lösung erhalten ... Sie können die Klicks auf die Ansichten (wie Kontrollkästchen in benutzerdefinierten Layouts der Zeile) erhalten, indem Sie jedem der Listen im Adapter selbst Listener hinzufügen, während Sie die konvertierte Ansicht in getView () zurückgeben. Möglicherweise müssen Sie eine Referenz des Listenobjekts übergeben, wenn Sie beabsichtigen, listenspezifische Informationen zu erhalten. wie Zeilen-ID.


0
2017-12-20 13:35



Ich möchte bestätigen, dass die Antwort des Pritam korrekt ist. Du brauchst ein onClickListener auf jedem Listenelement (definieren Sie es in den Adaptern getView()).

Sie können ein neues erstellen onClickListener() für jedes Element oder den Adapter implementieren onClickListener() - In diesem Fall müssen die Elemente markiert sein, damit der Zuhörer erfährt, auf welchem ​​Element er arbeitet.

Sich auf die Liste verlassen onItemClickListener() - wie jemand in einem anderen Thread empfohlen - wird nicht funktionieren wie der CheckBox wird das Klickereignis abfangen, so dass die Liste es nicht bekommt.

Und schließlich @Rahul und JVitella:

Die Situation ist, dass die CheckBox auf einem Listenelement muss unabhängig vom Listenelement selbst anklickbar und überprüfbar sein. Daher ist die Lösung wie oben beschrieben.


0
2018-02-09 15:51