如何使用ViewHolder模式在ListView项目中设置具有多个视图的事件侦听器

时间:2014-11-12 21:43:18

标签: java android listview android-listview

我有一个web api,它返回一个用户帖子列表,其中包含用户的姓名,用户名,图片,帖子,评论等。

在我的Android应用中,我有一个包含这些用户帖子的ListView。我使用适配器中的ViewHolder模式进行设置。

现在在每个ListView项目中,我需要在帖子上设置点击监听器,userimage,name,comment等。在监听器中,我需要获取ViewHolder的位置,以便从我的数据中获取相应的Object。我该怎么做?

2 个答案:

答案 0 :(得分:0)

每当你第一次给视图充气时,在你的适配器中,convertView == null,膨胀你的视图行,然后在新的膨胀视图上调用findViewById来获取你的子视图并单独设置它们的点击监听器。存储我用于我的应用程序的位置的一种方便方法是获取视图,并在视图上调用具有位置的setId()。然后,当您需要该位置时,可以在视图上调用getId()。

答案 1 :(得分:0)

您还可以在适配器中使用您的帖子(或其ID /位置)定义您自己的侦听器以进行参数。例如:

public interface OnPostClickListener {
    void onUserImageClick(Post post);
    void onUserNameClick(Post post);
    ...
}

private OnPostClickListener mListener;

public void setOnPostClickListener(OnPostClickListener listener) {
    mListener = listener;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    final Post post = getItem(position);
    ...
    holder.userImage.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) {
            if(mListener != null)
                mListener.onUserImageClick(post);
        }
    });
    holder.userName.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) {
            if(mListener != null)
                mListener.onUserNameClick(post);
        }
    });
    ...
}

在你的活动中:

mAdapter.setOnPostClickListener(new OnPostClickListener(){
    @Override
    public void onUserImageClick(Post post) {
        // Do something
    }
    @Override
    public void onUserNameClick(Post post) {
        // Do something
    }
});