Android getLastVisiblePosition在片段中返回-1
我有一个listfragment,它的listview是使用contacts提供者的游标加载程序加载的 要求:我需要在第一次加载listview时使用view.getLastVisiblePosition()一次,也需要在每次有滚动时使用一次 问题:view.getLastVisiblePosition在onScrollListener中工作,但在onActivityCreated()或onCreateView()或onViewCreated()中始终返回-1 代码:Android getLastVisiblePosition在片段中返回-1,android,Android,我有一个listfragment,它的listview是使用contacts提供者的游标加载程序加载的 要求:我需要在第一次加载listview时使用view.getLastVisiblePosition()一次,也需要在每次有滚动时使用一次 问题:view.getLastVisiblePosition在onScrollListener中工作,但在onActivityCreated()或onCreateView()或onViewCreated()中始终返回-1 代码: @Override
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Set up ListView, assign adapter and set some listeners. The adapter was previously
// created in onCreate().
setListAdapter(mAdapter);
final ListView v = getListView();
v.setOnItemClickListener(this);
v.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState) {
// Pause image loader to ensure smoother scrolling when flinging
if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_FLING) {
mImageLoader.setPauseWork(true);
} else {
mImageLoader.setPauseWork(false);
}
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
evaluateInviteView();
}
}
@Override
public void onScroll(AbsListView absListView, int i, int i1, int i2) {}
});
if (mIsTwoPaneLayout) {
// In a two-pane layout, set choice mode to single as there will be two panes
// when an item in the ListView is selected it should remain highlighted while
// the content shows in the second pane.
v.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
}
// If there's a previously selected search item from a saved state then don't bother
// initializing the loader as it will be restarted later when the query is populated into
// the action bar search view (see onQueryTextChange() in onCreateOptionsMenu()).
if (mPreviouslySelectedSearchItem == 0) {
// Initialize the loader, and create a loader identified by ContactsQuery.QUERY_ID
getLoaderManager().initLoader(ContactsQuery.QUERY_ID, null, this);
}
evaluateInviteView();
}
private void evaluateInviteView(){
final ListView v = getListView();
int LastVisiblePosition = v.getLastVisiblePosition();
Log.d("faizal","inside : " + LastVisiblePosition );
}
在另一个背景下,与会者在会议上提出了一个类似的问题。一种解决方案建议在runnable中执行view.getLastVisiblePosition()。但这对我来说也会返回-1。我通常使用它来获取lastvisibleposition
list.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view,
int scrollState) { // TODO Auto-generated method stub
int threshold = 1;
int count = list.getCount();
if (scrollState == SCROLL_STATE_IDLE) {
if (list.getLastVisiblePosition() >= count
- threshold) {
//do your stuff
}
}
}
我也有这个问题,我在拔头发。解决方案包含在以下内容中:
ListView
项实际填充需要一些时间,因此对getLastVisiblePosition()
的调用将返回-1,直到发生这种情况。解决方案是将一个新的Runnable
发布到Listview
,所有代码依赖于最后一个可见位置,并执行Runnable
中的所有内容
例如,我正在编写一些代码来动态修改每个列表项中的TextView:
list.post(new Runnable() {
@Override
public void run() {
int start = list.getFirstVisiblePosition();
int last = list.getLastVisiblePosition();
for (int i = start; i <= last; i++) {
View vv = list.getChildAt(i-start);
View v = list.getAdapter().getView(i, vv, list);
TextView tv = (TextView) v.findViewById(R.id.list_text);
// other stuff...
}
}
});
list.post(新的Runnable(){
@凌驾
公开募捐{
int start=list.getFirstVisiblePosition();
int last=list.getLastVisiblePosition();
for(int i=start;i在onScrollListener中使用getLastVisiblePosition()也适用于我。问题是它在ActivityCreated()或onCreateView()或onViewCreated()的任何生命周期方法中都不起作用。可能listview只是在这些方法之后的某个时间才初始化?如果是,我想知道它将在哪个生命周期方法中初始化?你能发布你活动的代码吗?因为我在onCreateView()中也使用了同样的东西,而且它工作得很好,这就是wierd。我已经发布了问题中的代码。evaluateInviteView()函数是我调用getLastVisiblePosition()的地方。为了简洁起见,我删除了大部分不相关的代码。如果我从onCreateView()或onViewCreated()调用evaluateInviteView(),结果是一样的。您是如何在onCreateView()中访问listview的?如果我在那里执行getListView(),它只会与“膨胀类片段时出错”。我正在使用customListadapter填充listview,并使用list.setadapter()填充适配器,如问题末尾所述,使用runnable对我不起作用。您找到解决方案了吗?