2011-04-05 2 views
1

Привет, ребята, у меня есть список, который использует настраиваемый макет строки. Макет состоит из 2 ярлыков, изображения и флажка.Просмотр событий внутри строки ListView

Я пытаюсь запустить слушателя, когда флажок установлен. Слушатель я написал работы, но вместо того, чтобы стрелять для отдельной строки, он запускается для каждой отдельной строки в списке. Как если бы я установил флажок в своей первой строке, диалог откроется и будет работать правильно, однако 2, 3 и 4 строки также будут «стрелять».

Вот соответствующая область моего кода:

public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    if (v == null) { 
     LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
       Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.row, null); 
    } 
    final item o = items.get(position); 
    if (o != null) { 
     TextView tt = (TextView) v.findViewById(R.id.name); 
     TextView bt = (TextView) v.findViewById(R.id.game); 
     CheckBox cb = (CheckBox) v.findViewById(R.id.caught); 
     if (cb != null && o.getStatus()) { 
      cb.setChecked(true); 
     } else { 
      cb.setChecked(false); 
     } 
     if (tt != null) { 
      tt.setText(o.getName()); 
     } 
     if (bt != null && o.getStatus()) { 
      bt.setText("Game: " + o.getGame()); 
     } 

     cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, 
        boolean isChecked) { 
       o.setStatus(isChecked); 
       if (isChecked) { 
       AlertDialog.Builder builder2 = new AlertDialog.Builder(
         context); 
       builder2.setTitle("What game are we talkin gabout?"); 
       builder2.setItems(Checklist.GAMES, 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, 
            int item) { 
           Toast.makeText(context, 
             Checklist.GAMES[item], 
             Toast.LENGTH_SHORT).show(); 
           o.setGame(Checklist.GAMES[item]); 
           o.setStatus(true); 
           me.notifyDataSetChanged(); 
          } 
         }); 
       builder2.show(); 
       } else { 
        o.setGame(""); 
        o.setStatus(false); 
        me.notifyDataSetChanged(); 
       } 
      } 
     }); 
    } 
    return v; 

} 

Есть ли более подходящее место, чтобы создать свой приемник для флажка?

+0

ли вы имеете в виду, что onCheckedChanged() вызывается для каждой строки - после того, как один клик? – DJC

+0

Да, не имеет значения, в какую строку они все будут звонить. – Vizirship

ответ

1

Я думаю, что это не хорошее решение, чтобы каждый новый просмотр OnCheckedChangeListener обновлялся со значениями. Было бы лучше установить слушателя только один раз для просмотра в точке, где это новое представление получает раздувание. Вы можете сделать o-Object доступным для слушателя, поместив его в тег cb (setTag (..)). Обратите внимание, что событие onCheckedChanged также срабатывает, когда вы устанавливаете состояние CB на cb.setChecked().

, например:

CheckBox cb = null; 
if (v == null) { 
    LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
      Context.LAYOUT_INFLATER_SERVICE); 
    v = vi.inflate(R.layout.row, null); 
    cb = (CheckBox) v.findViewById(R.id.caught); 
    // set a listener 
    cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, 
       boolean isChecked) { 
      item o = (item) buttonView.getTag(); 
      // show your dialog 
     } 
    }); 
} 

item o = items.get(position); 
if (o != null) { 
    TextView tt = (TextView) v.findViewById(R.id.name); 
    TextView bt = (TextView) v.findViewById(R.id.game); 
    cb = (CheckBox) v.findViewById(R.id.caught); 
    cb.setTag(o); 
    // set checked state & text 
    // ... 
} 
Смежные вопросы