0

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);
            }
        };
    }
}
4

1 に答える 1

1

ListView を格納する親アクティビティ/フラグメントで、OnItemClickListener を実装し、そこでクリックを処理できます。この方法では、インスタンス化するすべてのビューにクリック ハンドラーを割り当てる必要はありません。

元。MyListActivity という名前の ListActivity クラスがあるとしましょう (私はとてもクリエイティブです)

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);
    }

}
于 2012-04-12T18:05:59.670 に答える