2012-03-01 8 views
8

Jest kontynuacją tej question gdzie Reimar Twelker zasugerował użycie View.setFocusable() i View.setClickable() aby włączyć/wyłączyć wierszy w widoku listy używając ArrayAdapter.View.setFocusable() i View.setClickable() ma przeciwny efekt w zwyczaju ArrayAdapter

Próbowałem to zrobić, ale mam odwrotny skutek do tego, czego oczekiwałbym. Jeśli używam

View.setFocusable(true); 
View.setClickable(true); 

wiersz jest wyłączona (brak efektu po naciśnięciu go). A jeśli użyję czegoś odwrotnego:

View.setFocusable(false); 
View.setClickable(false); 

wiersz jest włączony (wybór zastosowany po naciśnięciu).

Jakąkolwiek wskazówkę dotyczącą tego, co może się wydarzyć?

Oto treść mojego układ:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/row_style" 
    android:layout_width="fill_parent" 
    android:layout_height="?android:attr/listPreferredItemHeight" 
    android:paddingLeft="5dip" 
    android:paddingRight="5dip"> 

    <ImageView android:id="@+id/row_image_style" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:adjustViewBounds="false" 
    android:scaleType="centerCrop" 
    android:drawingCacheQuality="low" /> 
</FrameLayout> 

używam go w oknie alertu tak:

dialog = new AlertDialog.Builder(this) 
      .setTitle(R.string.templates_dialog) 
      .setAdapter(new StyleAdapter(this, R.id.row_style, StyleTemplate.values()), 
       new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         setTemplate(StyleTemplate.values()[which]); 
        } 
       }) 
      .create(); 
      dialog.setCanceledOnTouchOutside(true); 

i StyleAdapter jest zdefiniowany następująco:

public class StyleAdapter extends ArrayAdapter<StyleTemplate>{ 

     private final StyleTemplate[] m_objects; 
     private final LayoutInflater inflater; 

     public StyleAdapter(Context context, int textViewResourceId, StyleTemplate[] objects) { 
      super(context, textViewResourceId, objects); 
      m_objects = objects; 
      inflater = getLayoutInflater(); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View row = convertView; 
      if (row == null) { // Reuse the old view if it exists 
       row = inflater.inflate(R.layout.row_style, parent, false); 
      } 

      // Get the selected style data 
      StyleTemplate style = m_objects[position]; 

      // Set the background image to the template background 
      ImageView bg = (ImageView) row.findViewById(R.id.row_image_style); 
      bg.setImageDrawable(null); 
      bg.setBackgroundColor(Color.rgb(style.bR, style.bG, style.bB)); 

      boolean val = true; 
      row.setFocusable(val); 
      row.setClickable(val); 

      return row; 
     } 
    } 

Aby przetestować efekt setFocusable() i setClickable(), po prostu zmienię wartość z val w StyleAdapter.getView().

+0

Najgorsze jest to, że nawet jeśli je wyłączysz, tylko blednie, ale nadal działa i przechwytuje zdarzenia. – Gangnus

+0

Naprawdę jestem tym zainteresowany, ponieważ próbuję wyłączyć selektor na liście listItem. Czy wywołanie setClickable (true) (w przeciwieństwie do setClickable (false)) na tym elemencie jest jedyną opcją lub czy istnieją inne sposoby? – doplumi

+0

@domenicop Możesz również spróbować przesłonić isEnabled (pozycja int) dla ArrayAdapter i zwracać wartość false dla wyłączonych elementów. Nie pamiętam, dlaczego nie chciałem iść tą drogą, ale to może ci pomóc. – Pooks

Odpowiedz

2

Właściwie here Znalazłem wyjaśnienie tego wszystkiego. Chodzi o to, że jeśli ustawisz widok tak, aby był klikalny, to pochłonie kliknięcie i nie będzie propagował go do kontenera.

Tak więc convertView.setClickable(true) faktycznie wyłącza kliknięcia.

Powiązane problemy