为什么android:transcriptMode =“normal”无法正常工作?

我一直在做很多摆弄我一直遇到的问题.每次将一个项目添加到我的listview(适配器)时会发生什么?如果我在最后一个项目(它将在一定程度上执行),我希望它会自动滚动;但是,如果一次添加3个或更多项,则不会自动滚动.

这是listview的XML

    

我尝试使用我找到here代码片段解决方法.

我的代码如下:

public void addChat(final String text,final String username) {
    this.runOnUiThread(new Runnable() {
        public void run() {
            globals.chatAdapter.add(DateFormat.format("hh:mmaa",Calendar.getInstance()).toString(),username,text);

            globals.chatAdapter.notifyDataSetChanged();

            int lastP = getListView().getLastVisiblePosition();
            int count = globals.chatAdapter.getCount() - 1;

            if (lastP == globals.chatAdapter.oldP || lastP == -1) {
                getListView().setSelection(count);
            }

            globals.chatAdapter.oldP = count;
        }
    });
}

这个问题是当一堆项目立刻进入时,getListView().getLastVisiblePosition()不会立即更新,导致setSelection()永远不会被调用,因此不会自动滚动.

有什么建议?

最佳答案
作为一种解决方法,我修改了滚动侦听器…有点粗糙,但它完成了工作.

代码 – 编辑后的新代码

    this.getListView().setOnScrollListener(new OnScrollListener() {
        public void onScroll(AbsListView view,int first,int visible,int total) {
            if (visible == 0 || visible < total && (first + visible == total) || (getListView().getTranscriptMode() == 2) && (first + visible == total)) {
                if (getListView().getTranscriptMode() != 2)
                    getListView().setTranscriptMode(2);
            } else {
                if (getListView().getTranscriptMode() != 0)
                    getListView().setTranscriptMode(0);
            }
        }

        public void onScrollStateChanged(AbsListView view,int scrollState) {}
    });

编辑6/6/11:

我继续修改它,因为我在自己的实现中发现了一个UI错误(在删除alwaysScroll xml设置后,初始捕捉到底部不会成功).我将保留上面的旧代码,但这就是我现在使用的内容

        getListView().setOnScrollListener(new OnScrollListener() {
            public void onScroll(AbsListView view,int total) {
                    if (visible == 0 || visible == total || (first + visible == total) {
                        if (getListView().getTranscriptMode() != AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL)
                            getListView().setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
                    } else {
                        if (getListView().getTranscriptMode() != AbsListView.TRANSCRIPT_MODE_DISABLED)
                            getListView().setTranscriptMode(AbsListView.TRANSCRIPT_MODE_DISABLED);
                    }
            }

            public void onScrollStateChanged(AbsListView view,int scrollState) {}
        });

相关文章

以下为个人理解,如错请评 CE: 凭据加密 (CE) 存储空间, 实际路径/data/user_ce/ DE: 设备加密 (DE) 存...
转载来源:https://blog.csdn.net/yfbdxz/article/details/114702144 用EventLog.writeEvent打的日志(或...
事件分发机制详解 一、基础知识介绍 1、经常用的事件有:MotionEvent.ACTION_DOWN,MotionEvent.ACTION...
又是好久没有写博客了,一直都比较忙,最近终于有时间沉淀和整理一下最近学到和解决的一些问题。 最近进...
Android性能优化——之控件的优化 前面讲了图像的优化,接下来分享一下控件的性能优化,这里主要是面向...
android的开源库是用来在android上显示gif图片的。我在网上查了一下,大家说这个框架写的不错,加载大的...