InfoListAdapter
次のコードを使用してリスト内のビューにデータを入力する があります。
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
。しかし、より深い問題は、このようなものをどのように設定するか、どこで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);
}
};
}
}