0

在我的GetView()我的BaseAdapter類的方法...我有一個視圖持有者。當我點擊holder.feedUpVotebuttonfeed.numOFLikes Textview會增加。問題是,當我向下滾動並向上滾動時,該值將恢復爲其原始值。我拒絕撥打notifydatasetChanged();,因爲我沒有添加任何東西或從列表中刪除任何東西。如何在BaseAdapter中設置Viewholder文本?

@Override 
public View getView(int i, View view, ViewGroup viewGroup) { 

     likes = new int[GlobalFeedTab.arrayFeedList.size()]; 
     ViewHolder holder; 

    if (view == null) { 

     position = i; 
     view = inflater.inflate(R.layout.feed_list_row, viewGroup, false);   

     holder = new ViewHolder(); 
     holder.feedNumOfLikes = (TextView) view.findViewById(R.id.feedNumofLikes); 
        holder.feedUpVoteButton = (Button) view.findViewById(R.id.feedUpVoteButton); 
     view.setTag(holder); 

     } 
    else if(view != null){ 

     position = i; 
     holder = (ViewHolder) view.getTag(); 

    } 

     HashMap<String, String> mFeed = new HashMap<>(); //Hashmap of data that I get from the MainActivity 
     mFeed = GlobalFeedTab.arrayFeedList.get(position); 

     holder.feedNumOfLikes.setText(mFeed.get("likes")); 
     holder.feedUpVoteButton.setTag(position); 

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

          int pos = (Integer) v.getTag(); 
          ParseObject parseObFeed = objects.get(pos);     

           likes[pos] += 1; 
           parseObFeed.put("likes", likes[pos]); 
           holder.feedNumOfLikes.setText(String.valueOf(parseObFeed.getInt("likes") 
           )); //This is where I set the Text 

           parseObFeed.saveInBackground(); 

      } 
     }); 
    } 


class ViewHolder { 

    TextView feedNumOfLikes; 
    Button feedUpVoteButton;  

} 
+0

爲什麼不使用ArrayAdapter或RecyclerView.Adapter? –

+0

'GlobalFeedTab.arrayFeedList'是我的ArrayAdapter。 @ cricket_007 – grant

+0

我不這麼認爲。這是'ArrayList' –

回答

0

在Android的適配器回收每個視圖,這意味着通常你的適配器創建唯一的7〜8(實際上,這取決於屏幕尺寸)的意見,並在不同的position.In只是你的情況重用這些意見只需要跟蹤適配器中每個位置的狀態。爲此,您可以創建一個對象數組(在您的情況下,只是一個整數數組,以跟蹤屏幕上每個位置的喜歡數)。

這是根據您的適配器礦思想的簡要說明:

private class YourAdapter extends BaseAdapter { 

    private int[] numberOfLikes=new int[getCount()]; 

    @Override 
    public View getView(final int index, View view, ViewGroup viewGroup) { 

     likes = new int[GlobalFeedTab.arrayFeedList.size()]; 
     ViewHolder holder; 

     if (view == null) { 

      position = i; 
      view = inflater.inflate(R.layout.feed_list_row, viewGroup, false); 

      holder = new ViewHolder(); 
      holder.feedNumOfLikes = (TextView) view.findViewById(R.id.feedNumofLikes); 
      holder.feedUpVoteButton = (Button) view.findViewById(R.id.feedUpVoteButton); 

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


        ParseObject parseObFeed = objects.get(pos); 
        likes[pos] += 1; 
        parseObFeed.put("likes", likes[pos]); 
        holder.feedNumOfLikes.setText(String.valueOf(parseObFeed.getInt("likes"))); //This is where I set the Text 

        parseObFeed.saveInBackground(); 


       } 
      }); 
      view.setTag(holder); 

     } 
     else if(view != null){ 

      position = i; 
      holder = (ViewHolder) view.getTag(); 

     } 

     HashMap<String, String> mFeed = new HashMap<>(); //Hashmap of data that I get from the MainActivity 
     mFeed = GlobalFeedTab.arrayFeedList.get(position); 

     holder.feedNumOfLikes.setText("Number of likes:"+Integer.toString(numberOfLikes[index])); //Just assign the value for 

     // holder.feedNumOfLikes.setText(mFeed.get("likes")); 
     // holder.feedUpVoteButton.setTag(position); // I don't know why are you doing this 

    } 



} 






class ViewHolder { 

    TextView feedNumOfLikes; 
    Button feedUpVoteButton; 

} 

我不知道,也許你想在你的代碼來實現這個想法,但我看不出它有。如果是的話,你需要提供更多的代碼。

你也可以嘗試使用RecyclerView.Adapter這更方便。然而,那麼你需要從ListViewGridView切換到RecyclerView這是可定製的,並且比上述更快一點。

相關問題