53 votes

ListView Android avec case à cocher et tous les éléments cliquables

Duplicata possible :
Android : Lier des données d'une base de données à une CheckBox dans une ListView ?

Je souhaite utiliser un ListView dont les éléments ont la disposition suivante

------------------------- 
 [CB]    TV            TV
-------------------------

CB est une case à cocher et TV est un Textview.

J'ai lu quelque part que l'on ne peut pas avoir d'éléments cliquables dans une ListView. Si vous en avez, vous ne pourrez pas cliquer sur les ListItems. Mais si je regarde l'application GoogleMail, c'est possible. Je peux marquer plusieurs messages avec la case à cocher (et ensuite sélectionner une action pour eux) ou je peux cliquer sur le ListItem (ou faire défiler avec le dpad) pour arriver à un autre écran. Quelqu'un a-t-il un code/exemple pour expliquer comment cela est possible ?

101voto

PacificSky Points 1469

Définissez le CheckBox como focusable="false" dans votre mise en page XML. Sinon, il volera les événements de clics de la vue en liste.

Bien sûr, si vous faites cela, vous devez gérer manuellement le marquage de l'option CheckBox comme étant cochée/décochée si l'élément de la liste est cliqué au lieu de l'icône CheckBox mais c'est ce que vous voulez de toute façon.

19voto

Erik Bergstedt Points 145

Définissez l'adaptateur de vue de liste à "simple_list_item_multiple_choice".

ArrayAdapter<String> adapter;

List<String> values; // put values in this

//Put in listview
adapter = new ArrayAdapter<UserProfile>(
this,
android.R.layout.simple_list_item_multiple_choice, 
values);
setListAdapter(adapter);

9voto

max4ever Points 2420
holder.checkbox.setTag(row_id);

y

holder.checkbox.setOnClickListener( new OnClickListener() {

                @Override
                public void onClick(View v) {
                    CheckBox c = (CheckBox) v;

                    int row_id = (Integer) v.getTag();

                    checkboxes.put(row_id, c.isChecked());

                }
        });

7voto

Borja Points 71

Ce code fonctionne sur mon projet et je peux sélectionner l'élément de la liste et la case à cocher.

<?xml version="1.0" encoding="utf-8"?>
<!-- Single List Item Design -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:clickable="true" >

    <TextView
        android:id="@+id/label"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="4" />

    <CheckBox
        android:id="@+id/check"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:focusable="false"
        android:text="" >
    </CheckBox>

</LinearLayout>

5voto

Udaykiran Points 2666

Le code ci-dessous vous aidera :

public class DeckListAdapter extends BaseAdapter{

      private LayoutInflater mInflater;
        ArrayList<String> teams=new ArrayList<String>();
        ArrayList<Integer> teamcolor=new ArrayList<Integer>();

        public DeckListAdapter(Context context) {
            // Cache the LayoutInflate to avoid asking for a new one each time.
            mInflater = LayoutInflater.from(context);

            teams.add("Upload");
            teams.add("Download");
            teams.add("Device Browser");
            teams.add("FTP Browser");
            teams.add("Options");

            teamcolor.add(Color.WHITE);
            teamcolor.add(Color.LTGRAY);
            teamcolor.add(Color.WHITE);
            teamcolor.add(Color.LTGRAY);
            teamcolor.add(Color.WHITE);

        }

        public int getCount() {
            return teams.size();
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

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

            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.decklist, null);

                holder = new ViewHolder();
                holder.icon = (ImageView) convertView.findViewById(R.id.deckarrow);
                holder.text = (TextView) convertView.findViewById(R.id.textname);

             .......here you can use holder.text.setonclicklistner(new View.onclick.

                        for each textview

                System.out.println(holder.text.getText().toString());

                convertView.setTag(holder);
            } else {

                holder = (ViewHolder) convertView.getTag();
            }

             holder.text.setText(teams.get(position));

             if(position<teamcolor.size())
             holder.text.setBackgroundColor(teamcolor.get(position));

             holder.icon.setImageResource(R.drawable.arraocha);

            return convertView;
        }

        class ViewHolder {
            ImageView icon;
            TextView text;

        }
}

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X