有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用ViewHolder为ListView项设置onClickListener

我有一个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。我的策略是使用现有的populateViews方法进行mListener更改

不用说,这是行不通的。我认为这里的部分问题是,因为当我设置mListeneronClickListener是空的,所以即使我更改了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);
            }
        };
    }
}

共 (1) 个答案

  1. # 1 楼答案

    在包含ListView的父活动/片段中,您可以实现ListListener并在那里处理您的单击。这样,您就不必为实例化的每个视图分配单击处理程序

    例如,假设您有一个名为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);
        }
    
    }