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这是可定制的,并且比上述更快一点。

相关问题