2016-05-23 58 views
0

我想顛倒ListView,以便最先出現的項目。我看到了修改getItem()方法的結果,但是這要求我向下滾動並滾動回來查看新項目。有沒有辦法讓項目出現在列表的頂部而不需要滾動?顛倒ListView的順序和顯示沒有滾動

public class ListAdapter extends ArrayAdapter<Comments> { 

    Firebase BaseRef = new Firebase(FIREBASE_URL); 
    Firebase PollsRef = mBaseRef.child(POLLS_LABEL); 
    Firebase UpdateRef = mPollsRef.child(mCurrentDateString).child(String.valueOf(mPollIndex + 1)); 
    Firebase CommentsRef = mUpdateRef.child(COMMENTS_LABEL); 
    int pollCommentCount; 


    public ListAdapter(Context context, int textViewResourceId) { 
     super(context, textViewResourceId); 
    } 

    public ListAdapter(Context context, int resource, List<Comments> items) { 
     super(context, resource, items); 
    } 


    @Override 
    public int getCount() { 
     CommentsRef.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       pollCommentCount = (int) dataSnapshot.getChildrenCount(); 
       Log.v("POLL_COMMENT_COUNT", "The poll comment count is " + pollCommentCount); 
      } 

      @Override 
      public void onCancelled(FirebaseError firebaseError) { 

      } 
     }); 
     return pollCommentCount; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     View v = convertView; 

     if (v == null) { 
      LayoutInflater vi; 
      vi = LayoutInflater.from(getContext()); 
      v = vi.inflate(R.layout.individual_comment, null); 
     } 

     Comments p = getItem(position); 

     if (p != null) { 
      TextView userID = (TextView) v.findViewById(R.id.user_ID); 
      TextView userComment = (TextView) v.findViewById(R.id.user_comment); 

      if (userID != null) { 
       userID.setText(p.getUserID()); 
      } 

      if (userComment != null) { 
       userComment.setText(p.getUserComment()); 
      } 
     } 


     return v; 
    } 

} 
+0

你能排序'Comments'列表發送給適配器之前?可能用'Collections'? – mattfred

+0

你可以發佈示例代碼嗎? – tccpg288

+0

使用Collections.sort和比較器對您的支持列表進行排序,並使用模型的新近度作爲要比較的字段。然後在您的適配器上調用notifyDataSetChanged來通知ListView它需要刷新自己。 –

回答

1

您可以在創建適配器之前對Comment列表進行排序。這樣,它們已經按照您希望它們的順序排列。我不知道對象包含的變量是什麼,它可以讓您知道它何時被修改,但假設它是日期,您可以按如下所示對列表進行排序:

Collections.sort(commentsList, new Comparator<Comment>() { 
    public int compare(Comment c1, Comment c2) { 
     return c1.getDate().compareTo(c2.getDate()); 
    } 
}); 

你也可以簡單地逆轉與Collections.reverse(commentList)

+0

我實際上使用Collections.reverse(mCommentArrayList),它的工作!一個變體,如果你想改變你的答案。 – tccpg288

+0

我已經更新了我的答案。真高興你做到了。 – mattfred

+0

其實,我現在遇到的問題是,我不斷地倒轉列表,因此它不顯示最近的評論 – tccpg288

0

通話notifyDataSetChanged()應該更新列表。

0

列表我意識到。新增()方法實際上是在一個特定的指數插入的項目。如果我總是向索引(0)添加新項目,那麼這些項目自然會以相反的順序出現。

我認爲谷歌會一直使用Android代碼更加直觀,允許插件()方法,但在指標(O)的add()方法提供的宗旨:

mUpdateRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      setImage(dataSnapshot); 
      setQuestion(dataSnapshot); 
      createInitialCommentIDArray(dataSnapshot); 
      mNumberOfCommentsAtPoll = (int) dataSnapshot.child(COMMENTS_LABEL).getChildrenCount(); 
      for (int i = 0; i < mNumberOfCommentsAtPoll; i++) { 
       String commentID = (String) dataSnapshot.child(COMMENTS_LABEL).child(mCommentIDArrayList.get(i)).child("COMMENT").getValue(); 
       Log.v("COMMENT_ID", "The comment ID is " + commentID); 
       String userID = (String) dataSnapshot.child(COMMENTS_LABEL).child(mCommentIDArrayList.get(i)).child("USER_ID").getValue(); 
       Log.v("USER_ID", "The user ID is " + userID); 
       mCommentArrayList.add(0 , new Comments(mUserAvatar, userID, commentID)); 
       mCommentAdapter.notifyDataSetChanged(); 
      } 

     }