2013-08-18 3 views
3

При использовании listView я заметил, что при настройке checkBox в listView слушатель не работает! На данный момент я пытаюсь реализовать два разныхon click listeners для listView. Первый для listView body, а второй для listView's body's checkBox. Тело listView должно (на данный момент) генерировать тост, а checkBox - генерировать еще один тост (пока).listView item listeners

Проблема, с которой я столкнулся, относится к checkBox.onClick . Логика реализована только в последнем (или любом случайном, но только одном) флажке в макете.

расположение

элемент управления ListView выглядит следующим образом:

enter image description here

MainActivity.java:

private void registerClickCallBack() { 
     // TODO Auto-generated method stub 
     ListView list = (ListView)findViewById(R.id.listViewComplex); 
     list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View viewClicked, int position, 
        long id) { 
       // TODO Auto-generated method stub 

       Random clickedRandom = randomList.get(position); 
       String message = "You have clicked position "+position+" which is titled "+clickedRandom.getTitle(); 
       Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show(); 
       final CheckBox check= (CheckBox)findViewById(R.id.checkBoxComplex); 
       check.setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View v) { 
         // TODO Auto-generated method stub 
         if(check.isChecked()){ 
         Toast.makeText(MainActivity.this, "Checked", Toast.LENGTH_LONG).show(); 
         } 
        } 
       }); 
      } 
     }); 
    } 



} 
+0

Я все еще не уверен, что вам нужно и что вы пытаетесь сделать. Я предполагаю, что вам нужно отобразить тост, когда вы установите флажок coz, это то, что вы говорите в приведенных ниже комментариях. Если да, попробуйте ниже. – Raghunandan

ответ

3

Добавить

android:focusable="false" 

к CheckBox в XML.

Предполагая, что вы хотите отправить тост по щелчку флажка. Попробуйте ниже

Вы должны использовать держатель вида для плавной прокрутки и производительности.

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

Инициализировать ваш listiew в onCreate. Из вашего предыдущего кода перед редактированием я мог видеть, как вы дважды вводите список. Нет необходимости в этом.

Изменение вы активность в

public class MainActivity extends Activity { 
    private List<Random> randomList = new ArrayList<Random>(); 
    ListView list; 
    ArrayAdapter<Random> adapter; 
    private SparseBooleanArray mCheckStates; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     list = (ListView)findViewById(R.id.listViewComplex); 
     adapter = new MyListAdapter(); 
     populateRandomList(); 
     populateListView(); 
     registerClickCallBack(); 
    } 

    private void populateRandomList() { 
     // TODO Auto-generated method stub 
     randomList.add(new Random("Title One", "Simple", "Status: OK", R.drawable.ic_launcher)); 
     randomList.add(new Random("Title Two", "Complex", "Status: WORKING", R.drawable.ic_launcher)); 
     randomList.add(new Random("Title Three", "Moderate", "Status: NOT OK", R.drawable.ic_launcher)); 
     randomList.add(new Random("Title Four", "Simple", "Status: BAD", R.drawable.ic_launcher)); 
     randomList.add(new Random("Title Five", "Moderate", "Status: NOT OK", R.drawable.ic_launcher)); 
     randomList.add(new Random("Title Six", "Simple", "Status: WORKING",R.drawable.ic_launcher)); 
     randomList.add(new Random("Title Seven", "Complex", "Status: EXCELLENT", R.drawable.ic_launcher)); 
     randomList.add(new Random("Title Eight", "Complex", "Status: NBA", R.drawable.ic_launcher)); 
    } 

    private void populateListView() { 
     list.setAdapter(adapter); 
    } 

    private class MyListAdapter extends ArrayAdapter<Random> implements CompoundButton.OnCheckedChangeListener{ 

     public MyListAdapter(){ 
      super(MainActivity.this,R.layout.layout_complex,randomList); 
      mCheckStates = new SparseBooleanArray(randomList.size()); 
     } 

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

     public View getView(int position, View convertView, ViewGroup parent){ 
      ViewHolder vh; 
      if(convertView == null){ 
       convertView = getLayoutInflater().inflate(R.layout.layout_complex,parent,false); 
       vh = new ViewHolder(); 
       vh.imageView = (ImageView)convertView.findViewById(R.id.itemImage); 
       vh.titleText = (TextView)convertView.findViewById(R.id.itemTitle); 
       vh.typeText = (TextView)convertView.findViewById(R.id.itemType); 
       vh.statusText = (TextView)convertView.findViewById(R.id.itemStatus); 
       vh.cb = (CheckBox) convertView.findViewById(R.id.checkBoxComplex); 
       convertView.setTag(vh); 
     } else { 
      vh = (ViewHolder) convertView.getTag(); 
     } 

      Random currentItem = randomList.get(position); 
      vh.imageView.setImageResource(currentItem.getIconID()); 
      vh.titleText.setText(currentItem.getTitle()); 
      vh.typeText.setText(currentItem.getType()); 
      vh.statusText.setText(currentItem.getStatus()); 
      vh.cb.setTag(position); 
      vh.cb.setChecked(mCheckStates.get(position, false)); 
      vh.cb.setOnCheckedChangeListener(this); 
      return convertView; 

     } 
     public boolean isChecked(int position) { 
       return mCheckStates.get(position, false); 
      } 

      public void setChecked(int position, boolean isChecked) { 
       mCheckStates.put(position, isChecked); 

      } 

      public void toggle(int position) { 
       setChecked(position, !isChecked(position)); 

      } 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, 
       boolean isChecked) { 
      mCheckStates.put((Integer) buttonView.getTag(), isChecked); 
      if(isChecked) 
       { 
       Toast.makeText(MainActivity.this, "Checked at "+(Integer) buttonView.getTag(), Toast.LENGTH_SHORT).show(); 
       } 

     } 
     class ViewHolder 
     { 
      TextView titleText,typeText,statusText; 
      ImageView imageView; 
      CheckBox cb; 
     } 
    } 

    private void registerClickCallBack() { 
     list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View viewClicked, int position, 
        long id) { 
       Random clickedRandom = randomList.get(position); 
       String message = "You have clicked position "+position+" which is titled "+clickedRandom.getTitle(); 
       Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show(); 

      } 
     }); 
    } 
} 

ФОТОГРАФИЯ

enter image description here

+0

+1 для завершения моего ответа –

+0

@Arash спасибо. я был не уверен в том, что захотел, или я мог бы опубликовать решение немного раньше. – Raghunandan

+0

спасибо вам большое. –