2016-11-28 29 views
-1

我已經永遠地研究這一點,並不能找到一個解決方案。關於我的自定義列表視圖的一切似乎都正確執行。當我點擊holder.feedUpVoteButton時,文本正確更改+=1。但是,當我向下滾動並向上滾動時,文本值將恢復爲單擊之前的值。的TextView值滾動之後又變回以前的值在底座適配器

我拒絕使用notifyDatasetChanged因爲我不添加任何內容或從列表中刪除任何東西。

public class CustomFeedListViewAdapter extends BaseAdapter{ 

    CustomFeedListViewAdapter customFeedListViewAdapter; 
    Date createdAt, currentDate; int num; 
    static HashMap<String, String> oneData = new HashMap<String, String>(); 
    HashMap<String, String> iFeed = new HashMap<>(); 


    private String likesString; 

    String upVoteClicked, downVoteClicked; 
    HashMap<String, String> mFeed = new HashMap<>(); 
    List<ParseObject> mObjects; 

    private ParseObject parseObFeed; 

     CustomFeedListViewAdapter(Context context, ArrayList<HashMap<String, String>> data) { 

     super(); 
     this.mContext = context; 
     GlobalFeedTab.arrayFeedList = data; 
     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 


    @Override 
    public int getCount() { 
     return GlobalFeedTab.arrayFeedList.size(); 
    } 

    @Override 
    public Object getItem(int i) { 
     return GlobalFeedTab.arrayFeedList.get(i); 
    } 

    @Override 
    public long getItemId(int i) { 
     return i; 
    } 

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

     likes = new int[GlobalFeedTab.arrayFeedList.size()]; 
     countryNames = new int[GlobalFeedTab.arrayFeedList.size()]; 
     dateNames = new String[GlobalFeedTab.arrayFeedList.size()]; 

     final 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); 



     } else { 
      position = i; 
      holder = (ViewHolder) view.getTag(); 
     } 


     mFeed = GlobalFeedTab.arrayFeedList.get(position); 

     holder.feedNumOfLikes.setText(mFeed.get("likes")); 

     likesString = mFeed.get("likes"); 
     likes[position] = Integer.valueOf(likesString); 

     holder.feedUpVoteButton.setTag(position); 

     ParseQuery<ParseObject> query2 = new ParseQuery<ParseObject>("FeedItem"); 
     query2.setLimit(250); 
     query2.addDescendingOrder("createdAt"); 

     query2.findInBackground(new FindCallback<ParseObject>() { 
      @Override 
      public void done(final List<ParseObject> objects, ParseException e) { 

       if (e == null) { 

        for (final ParseObject object : objects) { 



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

           int pos = (Integer) v.getTag(); 
           parseObFeed = objects.get(pos); 
           username = parseObFeed.getString("username"); 
           createdAt = parseObFeed.getDate("createdAt"); 

           likes[pos] += 1;       
           parseObFeed.put("likes", likes[pos]); 
           holder.feedNumOfLikes.setText(String.valueOf(parseObFeed.getInt("likes"))); 

           parseObFeed.put(ParseUser.getCurrentUser().getUsername() + "upvoteClicked", true); 

           parseObFeed.saveInBackground(); 
          } 
         });     

      } 
     }); 


     return view; 
    } 


    private class ViewHolder { 

     ImageView feedProfilePic; 
     TextView feedUsername; 
     TextView feedNumOfLikes; 
     TextView feedFeedItem; 
     TextView feedDate; 
     TextView feedNumofReplies; 
     Button feedUpVoteButton; 
     Button feedDownVoteButton; 
     Button feedCommentButton; 
     ListView feedListView; 

    } 

} 
+0

鏈接給我指導,但是,我仍然感到困惑如何使用'BaseAdapter'實現這一點。你能提供一個答案@ArpanSharma – grant

回答

1

不斷試錯後。我終於想出瞭如何在滾動後更改文本視圖。我的問題是我得到錯誤的ParseObject價值。我的主要活動包含一個ParseQuery,我從Hashmap();得到likes然而,由於某種原因,我無法直接傳遞喜歡的值,所以我通過了ParseObject本身。因此,在我的BaseAdapter類中不需要查詢。然後,我實現這些代碼行中GetView();回答我原來的問題:

holder.upvote[position] = holder.parseObList[position].getBoolean(ParseUser.getCurrentUser().getUsername() + "upvoteClicked"); 
    holder.downvote[position] = holder.parseObList[position].getBoolean(ParseUser.getCurrentUser().getUsername() + "downvoteClicked"); 

    if(holder.upvote[position] ){ 
     holder.feedUpVoteButton.setBackgroundResource(R.drawable.arrowclicked); 
     holder.feedNumOfLikes.setText(String.valueOf(holder.likes[position])); 

    } 
    else if(!holder.upvote[position]){ 
     holder.feedUpVoteButton.setBackgroundResource(R.drawable.arrowunclicked); 
     holder.feedNumOfLikes.setText(String.valueOf(holder.likes[position])); 


    } 
    if(holder.downvote[position]){ 
     holder.feedDownVoteButton.setBackgroundResource(R.drawable.arrowclicked); 

    } 
    else if(!holder.downvote[position]){ 
     holder.feedDownVoteButton.setBackgroundResource(R.drawable.arrowunclicked); 

    } 
+1

很高興你知道了。你可以使用'else'而不是''else if' not「 –

2

其實這是整個theory.When你遞增value.You有遞增從正在獲取的data.Because當你向下滾動列表值,上面的行將會丟失。當你滾動回來了,名單將再次從列表中values.So所有你需要做的就是在列表中也即GlobalFeedTab.arrayFeedList this鏈接是進一步的細節,爲尋找一些更詳細 當遞增值加載你寫這條線

likes[pos] += 1; 

你也必須增加在你的arraylist(mFeed)中的值,然後寫入notifyDataSetChanged();

+0

你能在你的答案中提供代碼嗎?我仍然對如何做到這一點感到困惑。 – grant

+0

如何增加數組列表中的值以及在哪裏?你能否給我一個完整的答案。 – grant

+0

發佈代碼不是必需的,可以解決我在問題中的問題。我只是複製,剪切和粘貼查詢以放置在'getView(){if(e == null){// here}}' – grant

1

每一次都getView被調用時,你重新做

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

當滾動這不會被保存,行你點擊葉子和重新進入顯示器。持有人可以持有這個整數值。

private class ViewHolder { 
    int likes; 
    TextView feedNumOfLikes; 
} 

和更新相應

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

      holder.feedNumOfLikes.setText(String.valueOf(++holder.likes)); 

但是,您還需要更新的解析對象。

parseObFeed.put("likes", holder.likes); 
parseObFeed.saveInBackground(); 
// notifyDataSetChanged(); // Up to you. Might not work without 

我拒絕使用notifyDatasetChanged因爲我不添加任何內容或從列表中刪除任何東西。

你是修改的數據,但。調用它將使您的適配器數據與您的Parse Server中存儲的數據保持一致。


編輯

這被因爲你在做每一個「行」具有與它關聯的對象的一些「嵌套」項目太複雜。我想你可以將整個列表存儲在持有者中。

private class ViewHolder { 
    // Java variables to hold onto 
    int likes; 
    List<ParseObject> feedItems = new ArrayList<ParseObject>(); 

    // Android views to bind those values to 
    TextView feedNumOfLikes; 
} 

適配器內部時,你可以調用解析得到這個二次名單在適配器中的每個項目,但你只需要存儲在托架內。當query2返回時,不要做任何事情。這裏

你真正的問題是,目前還不清楚query2甚至返回。這是一些數據清單,當然,但你真的想在列表中顯示一個列表?另外,適配器的每個項目都是從Parse查詢完全相同的數據。我認爲你需要一個過濾器...然後,你的position變量不對應GlobalFeedTab.arrayFeedListList<ParseObject>,因爲這些是不同的列表。

這裏只是我可以指出的一些意見。

else { 
     holder = (ViewHolder) view.getTag(); 
    } 

    // You don't need 'position', it is just the 'i' value... 
    mFeed = GlobalFeedTab.arrayFeedList.get(i); 

    // This is stored in the Activity, I guess? 
    likesString = mFeed.get("likes"); 
    holder.feedNumOfLikes.setText(likesString); 

    holder.feedUpVoteButton.setTag(i); 

    ParseQuery<ParseObject> query2 = new ParseQuery<ParseObject>("FeedItem"); 

    // This is getting some related "FeedItem" for the current row 
    // Just store the info, don't do anything with it yet 
    query2.findInBackground(new FindCallback<ParseObject>() { 
     @Override 
     public void done(final List<ParseObject> objects, ParseException e) { 
      if (e == null) { 
       holder.feedItems.clear(); 
       holder.feedItems.addAll(objects); 
       notifyDataSetChanged(); 
      } 
     } 
    }; 

    // Here, you can setup the button for the current row 
    holder.feedUpVoteButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      int pos = (Integer) v.getTag(); 

      // This is wrong... 'pos' is the position of the adapter! Not the index of List<ParseObject> results from earlier 
      // And this is a very clear ArrayIndexOutOfBounds error... 
      // The adapter could be shorter/longer than the holder.feedItems 
      parseObFeed = holder.feedItems.get(pos); 

      // !! TODO: Figure out which parseObFeed you actually want to use here 

      username = parseObFeed.getString("username"); 
      createdAt = parseObFeed.getDate("createdAt"); 

      holder.likes++; 
      parseObFeed.put("likes", holder.likes); 

      // This is the value that "resets" when you scroll. 
      // parseObFeed has not yet been saved, so when you scroll, the data isn't changed. 
      holder.feedNumOfLikes 
       .setText(String.valueOf(parseObFeed.getInt("likes"))); 

      // Not really sure what this does - You can store an array of likes rather than one field per username 
      parseObFeed.put(ParseUser.getCurrentUser().getUsername() + "upvoteClicked", true); 

      parseObFeed.saveInBackground(); 
      notifyDataSetChanged(); 
     } 
    });  
} 

我不記得,如果saveInBackground有所回調,但是這可能是一個尋找到

+0

這看起來非常詳細。我等不及要在幾分鐘內嘗試! @ cricket_007 – grant

+0

警告:它可能無法正常工作。只是拋出我看到的第一個問題。 –

+0

@espa_network此外,由於您直接在'onClick'中使用'objects.get(pos)',因此我認爲您不需要'for for(final ParseObject object:objects)'循環。在任何時候你都沒有使用你正在循環的''object' –

相關問題