Android 视图持有者模式问题。ArrayAdapter中的所有按钮都设置了相同的OnClickListener

Android 视图持有者模式问题。ArrayAdapter中的所有按钮都设置了相同的OnClickListener,android,listview,android-arrayadapter,onclicklistener,android-viewholder,Android,Listview,Android Arrayadapter,Onclicklistener,Android Viewholder,我不知道我哪里错了。我在自定义ListView适配器中创建了一个按钮,实现了ViewHolder模式并为按钮设置了OnClickListener 问题是,每当我点击任何一行上的按钮,我都会得到相同的点击结果。相同的标题,相同的用户名 我还需要设置什么?谢谢,圣诞快乐 自定义ListView适配器: public FeedListViewAdapter(Context context, int layoutResourceId, ArrayList<FeedItemsSetter> d

我不知道我哪里错了。我在自定义ListView适配器中创建了一个按钮,实现了ViewHolder模式并为按钮设置了OnClickListener

问题是,每当我点击任何一行上的按钮,我都会得到相同的点击结果。相同的标题,相同的用户名

我还需要设置什么?谢谢,圣诞快乐

自定义ListView适配器:

public FeedListViewAdapter(Context context, int layoutResourceId, ArrayList<FeedItemsSetter> data) {
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;
}

static class ViewHolder {        
    ImageView image;
    public TextView postTitle;
    public TextView postCateg;
    public TextView userInfo;
    public TextView likerNames;
    public ImageView feedUserImage;
    public Button feedLike;
    public Button feedShare;
    public Button likeButton;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    //ViewHolder holder = null;
    // test as field, maybe problem
    item = data.get(position);

    if (row == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);
        ViewHolder holder = new ViewHolder();

        holder.postTitle = (TextView) row.findViewById(R.id.postTitle);
        holder.postCateg = (TextView) row.findViewById(R.id.postCateg);
        holder.userInfo = (TextView) row.findViewById(R.id.feedUserName);
        holder.likerNames = (TextView) row.findViewById(R.id.likerNames);
        holder.feedUserImage = (ImageView) row.findViewById(R.id.feedUserImage);
        holder.image = (ImageView) row.findViewById(R.id.image);
        holder.feedLike = (Button) row.findViewById(R.id.feedLike);
        holder.feedShare = (Button) row.findViewById(R.id.feedShareBtn);
        holder.likeButton = (Button) row.findViewById(R.id.feedLike);

        row.setTag(holder);
    }

    ViewHolder holder = (ViewHolder) row.getTag();

    holder.postTitle.setText(item.getTitle());
    holder.postCateg.setText(item.getCategory());
    holder.userInfo.setText(item.getUser());
    holder.likerNames.setText(item.getLiker());
    holder.likerNames.setTag(item.getLikersLong());

    Picasso.with(context)
            .load("https://graph.facebook.com/" + item.getUserId()
                    + "/picture?type=large")
            .placeholder(R.drawable.placeholder)
            .error(R.drawable.placeholder)
            .transform(new RoundedTransformation(90, 4)).resize(100, 100)
            .centerCrop().into(holder.feedUserImage);

    Picasso.with(context)
            .load("http://www.edmondvarga.com/gastrolove/uploads/"
                    + item.getImage()).into(holder.image);

    holder.likerNames.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            //mListener.onNamesClick(v.getTag().toString());
        }
    });

    holder.feedLike.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {

            System.out.println(item.getUser() + item.getTitle());

    });

    return row;
}

public void setCallback(facebookShareListener mListener) {
    this.mListener = mListener;
}

public static interface facebookShareListener {
    public void onSharePressed(String title, String imagename, String userId);

    public void onNamesClick(String title);
}

}
公共FeedListViewAdapter(上下文上下文、int-layoutResourceId、ArrayList数据){ 超级(上下文、布局资源ID、数据); this.layoutResourceId=layoutResourceId; this.context=上下文; 这个数据=数据; } 静态类视图持有者{ 图像视图图像; 公共文本视图postTitle; 公共文本视图邮政编码; 公共文本视图用户信息; 公共文本视图类名称; 公共图像查看用户图像; 公共按钮馈线; 公用按钮馈线共享; 公共按钮式按钮; } @凌驾 公共视图getView(int位置、视图转换视图、视图组父视图){ 视图行=转换视图; //ViewHolder=null; //现场测试,可能有问题 item=data.get(位置); if(行==null){ LayoutInflater充气器=((活动)上下文)。getLayoutInflater(); 行=充气机。充气(layoutResourceId,父级,false); ViewHolder=新的ViewHolder(); holder.postTitle=(TextView)row.findViewById(R.id.postTitle); holder.postCateg=(TextView)row.findViewById(R.id.postCateg); holder.userInfo=(TextView)row.findViewById(R.id.feedUserName); holder.likerNames=(TextView)row.findViewById(R.id.likerNames); holder.feedUserImage=(ImageView)row.findViewById(R.id.feedUserImage); holder.image=(ImageView)row.findViewById(R.id.image); holder.feedLike=(按钮)row.findViewById(R.id.feedLike); holder.feedShare=(按钮)row.findViewById(R.id.feedShareBtn); holder.likeButton=(按钮)row.findViewById(R.id.feedLike); row.setTag(支架); } ViewHolder=(ViewHolder)row.getTag(); holder.postTitle.setText(item.getTitle()); holder.postCateg.setText(item.getCategory()); holder.userInfo.setText(item.getUser()); holder.likerNames.setText(item.getLiker()); holder.likerNames.setTag(item.getLikersLong()); 毕加索。与(上下文) .加载(“https://graph.facebook.com/“+item.getUserId() +“/picture?type=large”) .placeholder(R.drawable.placeholder) .错误(R.drawable.placeholder) .transform(新的RoundedTransformation(90,4)).resize(100100) .centerCrop().into(holder.feedUserImage); 毕加索。与(上下文) .加载(“http://www.edmondvarga.com/gastrolove/uploads/" +item.getImage()).into(holder.image); holder.likerNames.setOnClickListener(新的OnClickListener(){ @凌驾 公共void onClick(视图v){ //onNamesClick(v.getTag().toString()); } }); holder.feedLike.setOnClickListener(新的OnClickListener(){ @凌驾 公共void onClick(视图v){ System.out.println(item.getUser()+item.getTitle()); }); 返回行; } public void setCallback(facebookShareListener mListener){ this.mListener=mListener; } 公共静态接口facebookShareListener{ 已共享的公共void(字符串标题、字符串图像名称、字符串用户标识); 单击名称时的公共无效(字符串标题); } }
在if-else语句之外声明ViewHolder:

ViewHolder holder;

if (row == null) {
    holder = new ViewHolder();
    row.setTag(holder);
}else{
    holder = (ViewHolder) row.getTag();
}
将“位置”定义为“最终”,以便您可以在单击中访问特定的项目索引:

public View getView(final int position, View convertView, ViewGroup parent) {
       holder.feedLike.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            System.out.println(data.get(position).getUser() + data.get(position).getTitle());
       });
}
ArrayAdapter中的所有按钮都设置了相同的OnClickListener

使用与设置setOnClickListener相同的
ViewHolder
实例:

 ViewHolder holder;
   if (row == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);
        holder = new ViewHolder();
        holder.postTitle = (TextView) row.findViewById(R.id.postTitle);
        .....

        row.setTag(holder);
    }else{
      holder = (ViewHolder) row.getTag();
    }
     holder.postTitle.setText(item.getTitle());

Move
item=data.get(position)
getTag()
@MD之后没有区别,我仍然得到了所有单击的相同名称。@EdmondTamas by name您指的是这个
mListener.onNamesClick(v.getTag().toString())?@Raghunandan-不,这是对按钮的测试:holder.feedLike.setOnClickListener(新OnClickListener(){覆盖公共void onClick(视图v){System.out.println(item.getUser()+item.getTitle());@EdmondTamas,很高兴帮助您。