2015-08-31 3 views
1

Я вызываю событие OnItemClickListener в мой список lista, но он не работает, Toast не показан.Событие setOnItemClickListener не работает в моем списке

ниже моего кода fragment1.java

public class Fragment1 extends Fragment { 
    Switch mySwitch; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){  
     //nome dos reles 
     String[] atividades = new String[]{"lampada","tomada quarto","tomada cozinha","geladeira"}; 

     //interface 
     View view=inflater.inflate(R.layout.layout_acionamento, container,false);  

     //lista 
     ListView lista = (ListView)view.findViewById(R.id.mylistView);   

     //botão acionar 
     Button button = (Button) view.findViewById(R.id.buttonAcionar); 

     //adaptador de string para reles 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), R.layout.modelo_lista_reles,atividades); 
     lista.setAdapter(adapter); 

     //evento do botão acionar 
     button.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Toast.makeText(getActivity(), "CUBANAJARRA", getId()).show(); 
      } 
     }); 

     lista.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       // TODO Auto-generated method stub 
       Toast.makeText(getActivity(), "CUBANAJARRA_lista", getId()).show(); 
      } 
     }); 

     return(view); 
    } 
} 

Мой код modelo_lista_rele.xml (Я использую для создания списка с переключателем):

<?xml version="1.0" encoding="utf-8"?> 
<Switch xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentEnd="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentStart="true" 
    android:layout_alignParentTop="true"  
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:focusable="false" 
    android:focusableInTouchMode="false"/> 

мой код layout_acionamento.xml (используется для просмотра, что я вернусь в фрагмент):

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

    <ListView 
     android:id="@+id/mylistView" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/buttonAcionar" 
     android:layout_alignParentTop="true" 
     android:clickable="true" > 
    </ListView> 

    <Button 
     android:id="@+id/buttonAcionar" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:text="Acionar" /> 

</RelativeLayout> 
+0

Есть ли у вас кнопки или интерактивные изображения внутри ваших макетов элементов? – WindsurferOak

+0

Спасибо. Я ответил ниже. – WindsurferOak

+0

Я хотел, чтобы при щелчке на переключателе в элементе списка событие было вызвано ItemClickListener –

ответ

0

Wrap вы Switch вокруг с LinearLayout, и убедитесь, что вы либо блок descendantFocusability или установите переключатель в XML PARAMS фокусируемые и focusableInTouchMode ложь. Это должно заставить все работать. Что происходит, так это то, что коммутатор потребляет событие touch, поэтому ListView никогда не имеет возможности запускать OnItemClickListener.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:descendantFocusability="blocksDescendants" 
       android:layout_width="match_parent" 
       android:layout_height="50dp"> 

    <Switch 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
</LinearLayout> 

Редактировать: на основе комментариев: Посмотрите на эту YouTube video by Romain Guy on ListViews. Это должно дать вам хорошее представление о том, что происходит ниже.

Создать ViewHolder класс для отслеживания отдельных виджетов в макете элемента:

public static class ViewHolder{ 
    public Switch mSwitch; 
} 

Затем в адаптере, переопределить GetView. Приведенный ниже код может выглядеть странно, но это правильный способ получить преимущества повторного использования, чтобы ваш список быстро прокручивался.

 @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      ViewHolder holder; 
      if(convertView == null){ 
       convertView = mInflater.inflate(R.layout.modelo_lista_rele.xml, parent, false); 
       holder = new ViewHolder(convertView); 
       holder.switch = convertView.findViewById(R.id.my_switch); 
       convertView.setTag(holder); 
      }else{ 
       holder = (ViewHolder)convertView.getTag(); 
      } 

      String item = getItem(position); 

      //Do something with item here 
      //holder.mSwitch.setText(item); 
      //holder.mSwitch.setOnCheckedChangeListener(...) 

      return convertView; 
     } 
+0

Я не могу этого сделать, потому что если я включу свой 'Switch' в LinearLayout, я получу эту ошибку:« ArrayAdapter требует, чтобы идентификатор ресурса был TextView. » –

+0

Вы можете это сделать. Вам просто нужно переопределить ArrayAdapter.getView. Я обновлю свой ответ, чтобы включить как переопределить getView. – WindsurferOak

2
Toast.makeText(getActivity(), "CUBANAJARRA", getId()).show(); 

Третий параметр - длина не id. Попробуйте использовать Toast.LENGTH_LONG или Toast.LENGTH_SHORT вместо как:

Toast.makeText(getActivity(), "CUBANAJARRA", Toast.LENGTH_LONG).show(); 
+0

Ошибка возникает в случае OnItemClickListener, где ничего не работает. Скорее всего, он не называется. –

Смежные вопросы