2012-08-17 4 views
3

Ici, je crée une liste personnalisée avec checkbox/RadioButton. Je l'ai eu mais j'ai besoin de la sélection unique pour ça.ListView personnalisé avec sélection unique CheckBox

J'essaie d'utiliser ce lstvw.setChoiceMode(ListView.CHOICE_MODE_SINGLE); mais ça ne marche pas pour moi. Y at-il d'autres solutions pour cela alors s'il vous plaît faites le moi savoir.

main.java

private ImageAdapter adapter; 

private static String month[] = {"January","February","March","April","May", 
    "June","July","August","September", 
    "October","November","December"}; 


/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ListView lstvw = (ListView) findViewById(R.id.listView); 

    adapter = new ImageAdapter(this, month); 
    lstvw.setAdapter(adapter); 
     lstvw.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

    lstvw.setOnItemClickListener(this); 
} 

Je ne sais pas pour la façon d'ajouter du code pour la case à cocher dans l'adaptateur class.please vérifier la classe de l'adaptateur comme ci-dessous.

ImageAdapter.class

public class ImageAdapter extends BaseAdapter{ 

public String title[]; 
public String description[]; 
public Activity context; 
public LayoutInflater inflater; 

public ImageAdapter(Activity context,String[] title) { 
    super(); 

    this.context = context; 
    this.title = title; 

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

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return title.length; 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

public static class ViewHolder 
{ 

    TextView txtViewTitle; 

} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 

    ViewHolder holder; 
    if(convertView==null) 
    { 
     holder = new ViewHolder(); 
     convertView = inflater.inflate(R.layout.listitem, null); 

     holder.txtViewTitle = (TextView) convertView.findViewById(R.id.lstvw_textView); 
     convertView.setTag(holder); 
    } 
    else 
     holder=(ViewHolder)convertView.getTag(); 

    holder.txtViewTitle.setText(title[position]); 

    return convertView; 
} 

} 

EDIT:

Listitem.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="horizontal" > 

<TextView 
    android:id="@+id/lstvw_textView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_toLeftOf="@+id/itemCheckBox" 
    android:padding="8dp" 
    android:text="hello world" /> 



<CheckBox 
    android:id="@+id/itemCheckBox" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:gravity="right" /> 

+0

utilisation RadioButton est pour une seule sélection au lieu de listview. –

+0

voulez-vous sélectionner un seul élément dans la liste complète avec le bouton radio ou la sélection multiple avec la case à cocher? – swiftBoy

+0

@RDC oui je veux seulement un seul élément sélectionner –

Répondre

6

Voici ce que je ferais si je ne devais sélectionner qu'un seul élément à la fois.

Home.java (activité)

package com.lvcheck.activities; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 

public class Home extends Activity 
{ 
    private ListView lvCheckBox; 
    private Button btnCheckAll, btnClearALl; 
    private String[] arr = {"One", "Two", "Three", "Four", "Five", "Six"}; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     btnCheckAll = (Button)findViewById(R.id.btnCheckAll); 
     btnClearALl = (Button)findViewById(R.id.btnClearAll); 

     lvCheckBox = (ListView)findViewById(R.id.lvCheckBox); 
     lvCheckBox.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
     lvCheckBox.setAdapter(new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_multiple_choice, arr)); 


     btnCheckAll.setOnClickListener(new OnClickListener() 
     {   
      @Override 
      public void onClick(View arg0) 
      { 
       for(int i=0 ; i < lvCheckBox.getAdapter().getCount(); i++) 
       { 
        lvCheckBox.setItemChecked(i, true);    
       } 
      } 
     }); 

     btnClearALl.setOnClickListener(new OnClickListener() 
     {   
      @Override 
      public void onClick(View v) 
      { 
       for(int i=0 ; i < lvCheckBox.getAdapter().getCount(); i++) 
       { 
        lvCheckBox.setItemChecked(i, false);     
       } 
      } 
     }); 
    } 
} 

et mon fichier XML (main.xml) devrait comme ce

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:orientation="horizontal" 
     android:gravity="center" 
     android:layout_height="wrap_content"> 

     <Button 
      android:layout_width="wrap_content" 
      android:text="Check All" 
      android:layout_marginRight="7dip" 
      android:id="@+id/btnCheckAll" 
      android:layout_height="wrap_content"> 
     </Button> 
     <Button 
      android:layout_width="wrap_content" 
      android:text="Clear All" 
      android:id="@+id/btnClearAll" 
      android:layout_height="wrap_content"> 
     </Button> 
    </LinearLayout> 

    <ListView 
     android:layout_width="fill_parent" 
     android:id="@+id/lvCheckBox" 
     android:fadingEdge="none" 
     android:cacheColorHint="@null" 
     android:layout_height="fill_parent"> 
    </ListView> 
</LinearLayout> 

de sorte que la sortie sera comme cette façon ..

enter image description here

Source: here

laissez-moi savoir si vous avez des problèmes à ce sujet.

Edit: vérifier ce lien utile: Custom Single choice ListView

+0

Merci, je l'ai aussi fait à l'aide « nouvelle ArrayAdapter (ce, android.R.layout.simple_list_item_multiple_choice, arr) » Mais je veux cette classe en utilisant l'adaptateur personnalisé. –

+0

cochez [this] (http://stackoverflow.com/questions/8337180/custom-single-choice-listview) et [this] (http://tokudu.com/2010/android-checkable-linear-layout/) lien va sûrement vous aider – swiftBoy

2

Vous pouvez utiliser CheckBox dans votre classe d'adaptateur. Essaye ça.

@Override 
    public View getView(final int position, View convertView, 
      ViewGroup parent) { 
     // TODO Auto-generated method stub 

     if (convertView == null) { 
      inflater = LayoutInflater.from(adapterContext); 
      convertView = inflater.inflate(R.layout.view, null); 
      final ViewHolder viewHolder = new ViewHolder(); 

      viewHolder.name = (TextView) convertView.findViewById(R.id.txtName); 
      viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox1); 

      convertView.setTag(viewHolder); 
     } 

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

     holder.name.setText(collectContactList.get(position).getName()); 

     holder.checkBox.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       CheckBox cb = (CheckBox) v; 
       if (cb.isChecked() == true) 
       { 
        // Here you will get list of checked item. 
       } 

       else 
       { 
       // Here you will get list of unchecked item.  
       } 

      } 
     }); 

Espérons que cela vous aidera.

+0

Merci, mais je veux la sélection d'un seul article –

+0

Avez-vous une idée sur la case à cocher de sélection unique? –

+0

à l'intérieur de la condition if vous pouvez obtenir les éléments qui sont sélectionnés – Akshay

0

Son simple et vraiment utile.

int selected_position = -1 

public View getView(final int position, View convertView, ViewGroup parent) { 

    if (selected_position == position) { 
     CHECKBOX.setChecked(true); 

    } else { 
     CHECKBOX.setChecked(false); 

    } 
    CHECKBOX.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View view) { 


      if (((CheckBox) view).isChecked()) { 
       selected_position = position; 

      } else { 
       selected_position = -1; 
      } 


      notifyDataSetChanged(); 


     } 
    }); 
    return view; 
}