32

EDIT (SOLVED) Per la risposta, andare in fondo alla domanda.Il clic del listino non funziona con le caselle di controllo Android

Ho un listview e gonfio alcune righe in esso utilizzando un customadapter. La riga che viene gonfiata contiene una casella di controllo. Posso mantenere lo stato della casella di controllo, ma il problema è che le mie voci di elenco non sono più selezionabili. Ecco il mio codice:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    fl=(ListView)findViewById(R.id.MainMenu);//Mainmenu is listview 
    fl.setAdapter(new CustomAdapter(Annotate.this,R.layout.preann2,_dir));//preann2 is row and _dir is the list of objects 
    //fl.setOnItemClickListener(this); tried this too 
} 

public void onItemClick(AdapterView<?> a, View view, int pos, long id) 
{ 
     //Implementations 
} 

    public class CustomAdapter extends ArrayAdapter<String> 
{ 
    public CustomAdapter(Context context, int textViewResourceId,String[] objects) { 
     super(context, textViewResourceId,objects); 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
      LayoutInflater inflater=getLayoutInflater(); 
      View row=inflater.inflate(R.layout.preann2, parent, false); 
      try 
      { 

      TextView Name=(TextView)row.findViewById(R.id.title); 
      Name.setText("xyz"); 
      ImageView icon=(ImageView)row.findViewById(R.id.icon); 
      row.setFocusable(true); 
      row.setClickable(true); 
      row.setOnClickListener(new OnClickListener(){ 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        checkState[position]=!checkState[position]; 
       } 

      }); 
      CheckBox c=(CheckBox)row.findViewById(R.id.checkBox); 
      c.setChecked(checkState[position]); 
      c.setOnCheckedChangeListener(new OnCheckedChangeListener(){ 

       @Override 
       public void onCheckedChanged(CompoundButton v, 
         boolean isChecked) { 
        // TODO Auto-generated method stub 
        CheckBox checkBox=(CheckBox)v; 
        if (isChecked) { 
         checkState[position]=true; 
        } 
        else 
         checkState[position]=false; 
       } 
      }); 
      /* tried this too 
            c.setOnClickListener(new OnClickListener(){ 

       @Override 
       public void onClick(View v) { 
        CheckBox checkBox=(CheckBox)v; 
        if (checkBox.isChecked()) { 
         //checkBox.setChecked(false); 
         checkState[position]=true; 
        } 
        else 
         checkState[position]=false; 
       }});*/ 
      icon.setImageResource(R.drawable.ic_launcher); 
      }catch(Throwable err) 
      { 
       err.printStackTrace(); 
      } 
      return row; 
     } 
} 

Voglio che il listitems di essere cliccabile nel caso in cui l'utente vuole fare clic su un solo elemento.

EDIT (su richiesta del Akhil) - preann2.xml nella cartella layout:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:padding="4dip" 
    > 

<ImageView android:id="@+id/icon" 
android:layout_width="wrap_content" 
android:layout_height="fill_parent" 
android:layout_alignParentTop="true" 
android:layout_alignParentBottom="true" 
android:layout_marginRight="4dip"/> 


    <TextView 
    android:id="@+id/title" 
    android:layout_width="fill_parent" 
    android:layout_height="match_parent" 
    android:layout_weight="1" 
    android:ellipsize="end" 
    android:gravity="center_vertical" 
    android:singleLine="true" 
    android:textStyle="bold" /> 

<CheckBox 
    android:id="@+id/checkBox" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

</LinearLayout> 

main.xml nella cartella layout:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 


<ListView 
    android:id="@+id/MainMenu" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

</ListView> 

</LinearLayout> 

EDIT (RISOLTO) Basta aggiungere queste proprietà alla casella di controllo:

android:focusable="false" 
    android:focusableInTouchMode="false" 
+1

Se si desidera controllare la casella di controllo se si fa clic sulla riga, inserire le condizioni con 'onClickListener()' per la riga stessa. –

+0

Voglio fare altre azioni quando faccio clic sugli oggetti in listview. Caselle di controllo che posso impostare direttamente facendo clic su di esse, quindi problemi al riguardo. In realtà voglio chiamare un'attività quando faccio clic su un elemento. – silentkratos

+0

Prova ad aggiungere un 'log' all'interno di' onClickListener' per la casella di controllo e facci sapere se il registro è registrato. –

risposta

0

ho frainteso il problema .. please have a look here per il vostro problema .. auguriamo che possa risolvere il problema ..

+0

Ho fatto lo stesso. Textview, icona e checkbox in un unico layout. Mainview listview è in un altro layout. – silentkratos

+0

Ya ho capito ... ma quello che sto dicendo nel tuo ListItem Layout mantiene TextView & Icon in un Layout e imposta listener su quel layout nello stesso modo in cui lo hai fatto per Checkbox – Akhil

+0

ho condiviso i layout come una modifica. potresti mostrarmi come ..? per favore? – silentkratos

5

Utilizzare questa riga nella rootView dell'elemento di elenco
android: descendantFoc usabilità = "blocksDescendants"