簡體   English   中英

GridView Adapter 在 Scroll 上膨脹了 ArrayList 的錯誤位置

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM