0

В моем методе GetView() моего класса BaseAdapter ... У меня есть держатель для просмотра. Когда я нажимаю holder.feedUpVotebutton, текст feed.numOFLikes Textview увеличивается. Проблема в том, что когда я прокручиваю вниз и прокручиваю назад, значение возвращается к исходному значению. Я отказываюсь звонить notifydatasetChanged();, потому что я ничего не добавляю и ничего не удаляю из списка.Как установить текст в приложении в базовом адаптере?

@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, что более удобно. Однако тогда вам нужно переключиться с ListView или GridView на RecyclerView, который можно настроить, и немного быстрее, чем указано выше.

Смежные вопросы