[英]GridView Adapter inflates the wrong position of the ArrayList on Scroll
我正在嘗試為我的 GridView 創建一個 Like/Unlike 按鈕,並通過我的自定義 GridView 適配器向按鈕添加了一個 onClickListener。 然而我注意到了一些奇怪的事情。 適配器讀取當前顯示項下方的 arraylist 項的位置,從而向我的移動后端發送錯誤的 id。 錯誤的項目被“喜歡”。
這個問題的根源在於,當用戶位於 GridView 中的兩個數組列表項之間時,適配器獲取第二項而不是第一項的位置。 因此,當我點擊第一個項目的喜歡按鈕時,第二個項目會被喜歡,因為這是適配器讀取的位置。
我怎樣才能確保一個項目可以被“喜歡”,即使它們沒有完全“在視圖中”。
進一步說明:
這將正確地“喜歡”當前顯示的新聞源項目
這將“喜歡”第二個項目,因為它部分在視圖中
這是數組列表和位置選擇的代碼片段:
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
final ActivityTable act = actList.get(position);
vi = inflater.inflate(R.layout.feed_single_picture, null);
holder.likebtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Send like
}
//More code
return vi;
}
public static class Holder {
ImageButton likebtn;
}
我相信代碼沒有問題。 這是安卓的工作方式嗎? 我該如何解決?
這是一個主要問題,因為用戶無法在沒有完全看到項目的情況下點擊它的喜歡按鈕。 我怎樣才能避免這個錯誤?
如果這是您實現視圖模式的方式,那么請將您的 getView 方法更改為
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
final ActivityTable act = actList.get(position);
Holder holder;
if (vi == null) {
vi = inflater.inflate(R.layout.feed_single_picture, null, false);
holder = new Holder();
holder.likebtn = (ImageButton)convertView.findViewById(R.id.buttonId);
vi .setTag(holder); // setting Holder as arbitrary object for row
} else { // view recycling
// row already contains Holder object
holder = (Holder) vi .getTag();
}
holder.likebtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Send like
**here you can check the position**
}
//More code
return vi;
}
我從您的實現中看到的是,每次為每個位置調用 getView 時,您都會一次又一次地膨脹視圖。 另一方面,一個ViewHolder 對象將每個組件視圖存儲在 Layout 的標簽字段中,因此您可以立即訪問它們而無需重復查找它們。 此外,偵聽器將被正確附加......因為您的實現有一個靜態圖像按鈕,偵聽器附加到該按鈕上,該按鈕根據可見位置獲取項目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.