我一直在努力解决我一直遇到的问题。每次将一个项目添加到我的listview(适配器)时会发生什么?如果我在最后一个项目(它将在一定程度上执行),我希望它自动滚动;但是,如果一次添加3个或更多项,则不会自动滚动。
以下是该列表视图的XML:
<ListView android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:transcriptMode="normal"/>
我尝试使用我找到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()永远不会被调用,因此不会自动滚动。
有什么建议吗?
答案 0 :(得分:10)
作为一种解决方法,我修改了滚动侦听器......有点粗糙,但它完成了工作。
旧代码 - 编辑后的新代码
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 first, int visible, 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) {}
});
答案 1 :(得分:-2)
有一个更简单的解决方案。
lv.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
显然这必须在代码中完成。我找不到在布局文件中设置TRANSCRIPT_MODE_ALWAYS_SCROLL的方法。
答案 2 :(得分:-3)
或以XML布局,
android:transcriptMode="alwaysScroll"