1

我無法弄清楚我錯在哪裏。我在我的自定義ListView適配器內創建了一個按鈕,我已經實現了ViewHolder模式併爲按鈕設置了一個OnClickListener。ViewHolder模式問題。相同的OnClickListener爲ArrayAdapter中的所有按鈕設置

問題是,無論何時點擊任何行上的按鈕,我都會得到相同的點擊結果。相同的標題,相同的用戶名

我還需要設置什麼?謝謝,聖誕快樂!

自定義的ListView適配器:在if-else語句之外

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

} 
+0

移動'項= data.get(位置)' –

+0

@MD沒有性差異,我仍然對所有點擊獲得相同的名稱。 –

+0

@EdmondTamas按名稱引用此'mListener.onNamesClick(v.getTag()。toString());'? – Raghunandan

回答

1

申報ViewHolder:

ViewHolder holder; 

if (row == null) { 
    holder = new ViewHolder(); 
    row.setTag(holder); 
}else{ 
    holder = (ViewHolder) row.getTag(); 
} 

位置定義爲final,所以你可以訪問內點擊特定項指標:

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()); 
     }); 
} 
+1

感謝您的乾淨解決方案! –

+0

@ EdmondTamas,很高興爲您效勞。 –

2

Same OnClickListener set fo R內ArrayAdapter所有按鈕

ViewHolder對setOnClickListener作爲設置

使用相同的實例:之後`getTag()`

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()); 
相關問題