我有一个listview,每当列表更新时,我都会强行滚动到列表的底部。但是,在滚动到列表底部之后,由于某种原因,列表视图在此时变得固定,用户无法在列表上来回滚动以查看其他数据。
问题:在setSelection(list.getBottom())
之后,我应该怎样才能再次滚动整个列表?
@Override
public View getView(int position, View convertView, ViewGroup parent) {
/* the list is being populated here - the code has been omitted */
list.populateFrom(date, name, class);
list.clearFocus();
list.post(new Runnable() {
@Override
public void run() {
list.setSelection(list.getBottom());
}
});
return list;
}
}
答案 0 :(得分:3)
问题在于您正在呼叫
list.setSelection(list.getBottom());
getView()
中的,每次都称为 ,ListView需要绘制更多的视图。这意味着你不断向下滚动。
相反,请更新外部 Adapter
类的数据集(例如来自Activity/Fragment
),然后重置ListView
适配器或清除适配器并读取项目,然后调用setSelection()
。
一种方法:
Activity
开始AsyncTask
AsyncTask
通过List
更新doInBackground()
数据。
在onPostExecute()
中,使用从Adapter
传递的List
来实例化doInBackground()
。或者清除当前Adapter
的数据集,然后循环浏览列表并将项目重新添加到Adapter
。
如果要重新验证Adapter
,请将ListView
的{{1}}设置为您创建的内容。
致电Adapter
答案 1 :(得分:0)
cus= new Customlistadapter(paramets for customer adapter));//Custom list adapter
lv1 = (ListView) findViewById(R.id.list);
lv1.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
lv1.setStackFromBottom(true);
cus.notifyDataSetChanged();// for refreshing listview with updates
lv1.setAdapter(cus);
cus.registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
super.onChanged();
lv1.setSelection(cus.getCount() - 1);
}
});
在您的活动类中使用以上内容。 A - C指出了这个问题。
如果您在活动类中使用AysncTask,请尝试以下代码。
private class DownloadFilesTask extends AsyncTask<Void, Void, VOid> {
protected void onPreExecute()
{
//display progress dialog
}
protected Long doInBackground(Void... params) {
// get data from server
return null;
}
protected void onPostExecute(Void params) {
// dismiss dialog
//set data
// paste the above listview code here.
}
}
答案 2 :(得分:0)
正如A - C所建议的那样,
存在问题list.setSelection(list.getBottom());
每次调用getView()时,您都会将视图移动/滚动到底部,因此当您尝试再次滚动视图时,会调用getView()并再次移动到底部。 因此,不应将列表视图中的选择设置为getView()中的底部,而应将其放在activity / fragment中。 在活动中,您会观察到更改并将选择设置到底部。
如果这对您的问题有用,请执行upvote