2012-01-21 15 views
27

mam ListView który używa niestandardowych zasilacz, ale nie mogę kliknąć na ListView poz ..Elementy ListView nie są klikalne. czemu?

aktywny do widoku listy ..

package com.adhamenaya.projects; 

import java.util.ArrayList; 

import android.app.Activity; 
import android.content.Context; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.Filter; 
import android.widget.Filterable; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.adhamenaya.classes.Place; 

public class PlacesListActivity extends Activity { 
    private ArrayList<Place> places; 
    private ArrayList<String> items; 
    GridviewAdapter mAdapter; 
    private ListView lvPlaces; 
    private EfficientAdapter adap; 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.places_list); 
     lvPlaces = (ListView) this.findViewById(R.id.lvPlaces); 
     new DowanloadPlaces().execute(""); 
    } 
    private void bindList(ArrayList<Place> places) { 
     this.places = places; 
     // Start creating the list view to show articles 
     items = new ArrayList<String>(); 
     for (int i = 0; i < places.size(); i++) { 
      items.add(String.valueOf(places.get(i).mName)); 
     } 
     adap = new EfficientAdapter(this); 
     adap.notifyDataSetChanged(); 
     lvPlaces.setAdapter(adap); 
    } 

    // EfficientAdapter : to make a customized list view item 
    public class EfficientAdapter extends BaseAdapter implements Filterable { 

     // The function of inflater to convert objects from XML layout file (i.e. main.xml) to a programmable 
     LayoutInflater inflater; 
     Context context; 

     public EfficientAdapter(Context context) { 
      inflater = LayoutInflater.from(context); 
      this.context = context; 
     } 

     public int getCount() { 
      // Get the number of items in the list 
      return items.size(); 
     } 

     public Object getItem(int position) { 
      // To return item from a list in the given position 
      return items.get(position); 
     } 

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

     public View getView(final int position, View convertView,ViewGroup parent) { 
      ViewHolder holder; 
      if (convertView == null) { 
       convertView = inflater.inflate(R.layout.adaptor_content, null); 

       holder = new ViewHolder();// Create an object to hold at components in the list view item 
       holder.textLine = (TextView) convertView.findViewById(R.id.textLine); 
       holder.buttonLine = (Button) convertView.findViewById(R.id.buttonLine); 
       holder.buttonLine.setOnClickListener(new OnClickListener() { 
        private int pos = position; 

        public void onClick(View v) { 
         places.remove(pos); 
         bindList(places);// to bind list items 
         Toast.makeText(getApplicationContext(),"Deleted successfuly :)", Toast.LENGTH_LONG).show(); 
        } 
       }); 
       convertView.setTag(holder); 
      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 
      // Bind the data efficiently with the holder. 
      holder.textLine.setText(String.valueOf(places.get(position).mName)); 
      return convertView; 
     } 

     public Filter getFilter() { 
      // TODO Auto-generated method stub 
      return null; 
     } 

    } 

    // ViewHolder : class that represents a list view items 
    static class ViewHolder { 
     TextView textLine; 
     Button buttonLine; 
    } 

    // DownloadRSSFeedsTask: works in a separate thread 
    private class DowanloadPlaces extends AsyncTask<String, Void, ArrayList<Place>> { 

     @Override 
     protected ArrayList<Place> doInBackground(String... params) { 
      ArrayList<Place> places = new ArrayList<Place>(); 
      Place p = new Place(); 
      for(int i =0;i<25;i++){ 
       p.mName = "Al Mathaf Hotel"; 
       places.add(p);    
      } 

      return places; 
     } 

     @Override 
     protected void onPostExecute(ArrayList<Place> places) { 
      bindList(places); 


     } 

    } 


} 

układ places_list.xml

układ adaptor_content.xml

<ImageView 
    android:id="@+id/imageView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/textLine" 
    android:layout_centerVertical="true" 
    android:src="@drawable/settings" /> 

</RelativeLayout> 
+0

gdzie jest Twój OnClickListener dla ListView? –

+0

Chciałbym również użyć ContextMenu dla elementów listy dla tego zadania (usunąć element listy), ale to zależy od Ciebie ... –

+0

Jakie zachowanie, które widzisz, prowadzi do przekonania, że ​​nie można go kliknąć? Czy jesteś pewien, że element ListView jest ustawiony do kliknięcia? Jeśli nie, zdarzenia onClick nie zostaną wygenerowane. Zasadniczo, jeśli napotkasz problem: 1. Najpierw zrób jak najwięcej debugowania. 2. Jeśli spodziewasz się zachowania i nie nastąpi, upewnij się, że kod osiąga punkt, w którym można oczekiwać wystąpienia tego zachowania. Jeśli nie, opublikuj kod i pytanie "dlaczego mój kod nie osiąga punktu "? 3. Jeśli masz awarię, opublikuj komunikat o awarii i ślad stosu, a następnie zapytaj "Dlaczego mój kod się przerywa?" M –

Odpowiedz

2

spróbować uzyskać ostrości: View.getFocus();

+0

Myślę, że to już nie jest dostępne –

132

Android nie zezwala na wybieranie elementów listy, które można ustawiać w trybie ogniskowania (przyciski). Modyfikacja atrybutu XML przycisku do:

android:focusable="false" 

Trzeba jeszcze być klikalne, po prostu nie zyska ostrość ...

+4

Dziękuję, to powinno być oznaczone jako odpowiedź! Rozwiązałem mój problem. –

+10

FYI: Dzieje się tak nie tylko z przyciskami, ale z widokami TextView, które mają "zestaw tła". Użyłem 'focable =" false "', aby ominąć to. –

+0

Prawidłowo umieszczam wszystko pod androidem: focusable = "false" i teraz wszystko dobrze: D – aimiliano

1

zobacz Lista elementy są klikalne. Aby z niego skorzystać, musisz ustawić detektor kliknięcia pozycji w widoku listy. Wtedy to zadziała.

+0

Czy możesz rozwinąć "słuchacza z ustawionymi kliknięciami", w jaki sposób chciałbyś to zrobić? – Zapnologica

25

miałem ten sam problem z ListView, który zawierał tylko RadioButton:

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

<RadioButton 
    android:id="@+id/userNameRadioButton" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" /> 

</LinearLayout> 

użyłem RadioButton w każdym rzędzie, aby wyświetlić domyślny wybór elementu, aby kliknięcia uchwyt ListView musiałem użyć:

radioButton.setFocusableInTouchMode(false); 
radioButton.setFocusable(false); 

lub w pliku XML:

android:focusable="false" 
android:focusableInTouchMode="false" 

Więc jest to kwestia związana ostrości ... Wit h powyższe modyfikatory są skierowane do ListView po kliknięciu.

+5

Dziękuję za wyjaśnienie! Miałem 'CheckBox' w moim i zastanawiałem się, dlaczego mogłem kliknąć element' CheckBox', ale nie 'ListView'. Dla rekordu pole wyboru (lub w twoim przypadku przycisk opcji) może pozostać klikalne, ale nie można go ustawiać. Możesz także zrobić to w XML z 'android: focusable =" false " android: focusableInTouchMode =" false "' – Randy

+0

Naprawiłem to dla mnie. Najwyraźniej nie wystarczyło to zrobić w xml. To zadziałało, gdy zrobiłem to programowo. – user990230

+0

wydaje się dziwne, musisz ustawić to zarówno w XML i kodu, ale to rozwiązanie działa dla mnie. Dobra robota! – Hector

-2

ustawić android: klikalne = "false" android: Regulowana = "fasle"

+1

w jakim elemencie? – DevZer0

1

ja dość późno, ale odkrył coś, myślę, że to ciekawy temat to:

jeśli adapter zstępuje z ArrayAdapter , o ile próbowałem, onItemClickListener nie jest wywoływany.

Jednakże, jeśli twój adapter pochodzi od BaseAdapter (musisz więc zaimplementować getCount() i getItem(), trywialny dla tablicy), to jest on zawsze wywoływany.

3

Rozważyć wartość tekstu wybierane przez określenie android: textIsSelectable = "true"

Nie słuchaj Google.W układzie wierszy, ustaw

textIsSelectable="false"

Dziękuję Lint (nie!)

+0

Dzięki za +1. Funkcja _textIsSelectable = "false" _ powinna znajdować się obok próby po ustawieniu _android: focusable = "false" _. Wiem, że wezmę sugestie Linta z przymrużeniem oka następnym razem ^^ –

+0

Możesz też spróbować Upvoting :) Cieszę się, że kolejny problem został rozwiązany. –

3

Chciałem dodać komentarz Aby odpowiedzieć rupps, ale nie mam wystarczająco dużo reputacji.

Jeśli używasz niestandardowego adapter rozszerzający ArrayAdapter można nadpisać z areAllItemsEnabled() i IsEnabled (int pozycja) w swojej klasie:

@Override 
public boolean areAllItemsEnabled() { 
    return true; 
} 

@Override 
public boolean isEnabled(int position) { 
    return true; 
} 

Powyższa stały mój non listy klikalne pogląd. Być może ten komentarz pomaga również innym osobom, ponieważ "nie można kliknąć listy Androida", hasło wyszukiwania jest dosyć wysokie w Google.

+0

działa również w celu rozszerzenia BaseAdaptera –

+0

@MarcioGranzotto ta odpowiedź działa tylko dla ArrayAdapter. jak to zrobić za pomocą 'BaseAdapter'a – Prabs

1

używałem widoku i przycisk wewnątrz widoku listy więc użyłem:

android:focusable="false" 

dla <button> i <view> ...

Potem używany następujący kod do mojego widoku listy i to pracował

// Attach the adapter to a ListView 
ListView listView = (ListView) findViewById(R.id.shipping_item_list); 
listView.setAdapter(adapter); 
listView.setOnItemClickListener(listPairedClickItem); 

private AdapterView.OnItemClickListener listPairedClickItem = new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 

    Toast.makeText(getBaseContext(), "Item ", Toast.LENGTH_LONG).show(); 
    } 
}; 
11

Ta odpowiedź tutaj pracował dla mnie: https://stackoverflow.com/a/16536355/5112161

Głównie dodał w LinearLayout lub RelativeLayout następujące:

android:descendantFocusability="blocksDescendants" 

Należy również usunąć z całego xml następujące:

android:focusable="false" 
android:focusable="true" 
android:clickable="true" 
android:clickable="false" 
+0

android: descendantFocusability =" blocksDescendants "+1 dla tego –

+0

android: descendantFocusability =" blocksDescendants "już mi pomogło +1 – vida

0

Dla mnie problemem było to, że moje przedmioty w ramach mojego ListView miał clickable ustawiony na true.

+0

Czy masz na myśli ustawienie go na" false? " Mam widok złożony w widoku listy i ustawiam klikalny na false dla każdego przycisku wewnątrz widoku złożonego i to działa. –

Powiązane problemy