2012-04-12 1 views
0

У меня есть InfoListAdapter, который использует следующий код для заполнения представления в списке:Установка onClickListener для элемента ListView с помощью ViewHolder

public InfoListAdapter(final Context context) { 
     super(context, 0); 
    } 

    @Override 
    public View getView(final int position, View convertView, final ViewGroup parent) { 
     ViewHolder viewHolder; 

     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.info_list_item, null); 
      viewHolder = new ViewHolder(convertView); 
      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     viewHolder.populateViews(getItem(position)); 

     return convertView; 
    } 
} 

Я интересно, как я могу следовать этому ViewHolder и неподвижное добавить onClickListener который запустит другую активность DetailListActivity при нажатии. Мой страж должен был внести изменения mListener с использованием существующего метода populateViews.

Излишне говорить, что это не работает. Я думаю, что часть проблемы здесь заключается в том, что поскольку mListener имеет значение null, когда я устанавливаю onClickListener, эта ссылка сохраняется даже после изменения значения mListener. Но более глубокий вопрос заключается в том, как do Я установил что-то вроде этого, где я могу использовать шаблон ViewHolder и позволить populateViews сделать декор (с точки зрения добавления слушателя к действию нажатия)?

class ViewHolder { 
    private TextView mTextViewDisplayName; 
    private OnClickListener mListener; 
    private Context mContext; 

    public ViewHolder(final View view) { 
     mTextViewDisplayName = (TextView) view.findViewById(R.id.tv_displayname); 
     view.setOnClickListener(mListener); 
     mContext = view.getContext(); 
    } 

    public void populateViews(final Info infoItem) { 
     mTextViewDisplayName.setText(infoItem.displayName); 

     mListener = new OnClickListener() { 

     public void onClick(View view0) { 
       Intent mIntent = new Intent(mContext, DetailActivity.class); 
       mIntent.putExtra(EMService.INTENT_EXTRA_DETAIL_VIEW_SOMEPARAM, 0); 
       startActivityForResult(mIntent, 0); 
      } 
     }; 
    } 
} 

ответ

1

В вашей родительской деятельности/фрагмент, который находится ваш ListView можно реализовать OnItemClickListener и обрабатывать ваши клики там. Таким образом, вам не нужно назначать обработчик кликов для каждого отдельного представления, которое вы создаете.

Ex. Допустим, у вас есть класс с именем ListActivity MyListActivity (я так творческий)

public class MyListActivity extends ListActivity implements OnItemClickListener 
{ 
    @Override 
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) 
    { 
     Intent intent = new Intent(this, DetailActivity.class); 
     intent.putExtra(EMService.INTENT_EXTRA_DETAIL_VIEW_SOMEPARAM, 0); 
     startActivityForResult(intent, 0); 
    } 

} 
+0

И как я могу связать, что слушатель onItemClick к ListView моей деятельности в? –

+0

Чтобы быть ясным, я попробовал 'this.getListView(). SetOnItemClickListener (this)', но является ли это идеальным способом для этого? Зачем мне даже связывать его, когда я реализовал интерфейс 'OnItemClickListener'? Не следует ли это автоматически делать это? –

+0

@Luksprog Я определенно «расширил ListActivity» и «реализовал OnItemClickListener» и добавил переопределение '(void) onItemClick', но он работает только, когда я связываю его с помощью' this.getListView(). SetOnItemClickListener (this) ' , Если у меня нет этой строки, ничего не происходит с щелчком элемента. –

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