[android]ListView 添加项目后不会滚动到底部

发布时间: 2017/3/19 14:13:53
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

Activity包含编辑文本,提交 button ,和一个列表 view ,从服务器中获取其数据。单击时,编辑文本,它滚动到底部,它应该︰

  editText.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

            getWindow().setSoftInputMode(
                    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
            scrollMyListViewToBottom();
            Log.i("yoyo","ListSize Before: " + size);
    }
});

然而,当我点击提交 Button ,前后列表 view 更新时 notifydatasetchanged(); 是称,它不会滚动到底部。如果你想知道什么会发生在 CommentQuery(); ,我可以提供更多的代码。

    submitComment.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            commentItem = new ParseObject("CommentItem");
            commentItem.put("parentUser", feedUserName);
            commentItem.put("parentFeed", feedItem);
            // commentItem.put("parentObjectId", objectId);
            commentItem.put("commentText", String.valueOf(commentText.getText()));
            commentItem.put("username", ParseUser.getCurrentUser().getUsername());
            commentItem.put("country", ParseUser.getCurrentUser().getInt("country"));
            commentItem.put((ParseUser.getCurrentUser().getUsername() + "globalPoints"), 0);
            commentItem.put("parentObjectId", objectId);
            replies +=1;


            commentItem.saveInBackground(new SaveCallback() {
                @Override
                public void done(ParseException e) {
                    if (e == null) {
                        arrayCommentList.clear();
                        comments.clearCachedResult();
                        CommentQuery();
                    customCommentListViewAdapter.notifyDataSetChanged();

                        Log.i("yoyo","ListSize After: " + size);   //size changes like it is supposed to

                        scrollMyListViewToBottom(); //doesn't do anything
                    }
                }
            });

        }
    });

scrollMyListViewToBottom() 函数︰

   public void scrollMyListViewToBottom() {
    commentList.post(new Runnable() {
        @Override
        public void run() {
            // Select the last row so it will scroll into view...

            commentList.setSelection(size);
        }
    });

}

CommentQuery 函数︰

public void CommentQuery(){

    comments = new ParseQuery<>("CommentItem");
    comments.setLimit(99);
    comments.whereEqualTo("parentObjectId", objectId);
    comments.findInBackground(new FindCallback<ParseObject>() {
        @Override
        public void done(List<ParseObject> mobjects, ParseException e) {

            if(e == null){

                for(ParseObject object : mobjects){

                    parseObs = mobjects;

                     size = parseObs.getsize();

                    commentData = new HashMap<>();
                    commentData.put("username", object.getString("username"));
                    commentData.put("feed", object.getString("commentText"));
                    commentData.put("likes", String.valueOf(object.getInt("likes")));
                    commentData.put("country", String.valueOf(object.getInt("country")));
                    commentData.put("replies", String.valueOf(0));
                    commentData.put("global", String.valueOf(object.getInt(usernameText+"globalPoints")));

                    arrayCommentList.add(commentData);

                }
                customCommentListViewAdapter = new CustomCommentListViewAdapter(getApplicationContext(), arrayCommentList);
                commentList.setAdapter(customCommentListViewAdapter);
            }

        }
    });

}

解决方法 1:

首先-不要这样做。parseObs = mobjects;无论 adapter 设置使用 parseObs 只是失去了对该列表的引用。

相反,您需要这样做。

parseObs.clear();
parseObs.addAll(mobjects);

下一步, size = parseObs.getsize(); 绝对不需要要在循环中。虽然你遍历它大小不应该更改列表。


最后,这已经做什么,你想在解析回调

customCommentListViewAdapter = new CustomCommentListViewAdapter(getApplicationContext(), arrayCommentList);
commentList.setAdapter(customCommentListViewAdapter);

你不需要通知 adapter 再一次。

CommentQuery();
// customCommentListViewAdapter.notifyDataSetChanged(); // Not necessary

然后, CommentQuery异步的。

arrayCommentList.clear(); // List is now empty
... 
CommentQuery(); // doing stuff ... in the background
..
scrollMyListViewToBottom(); // there isn't anything to scroll to yet!

基本上,解决方案是对 scrollMyListViewToBottom()CommentQuery()done { } 方法块,将后 ListView 包含的数据。

评论的那样 size 是没有必要的变量。只需使用customCommentListViewAdap‌​ter.getCount()

官方微信
官方QQ群
31647020