【问题标题】:getLastVisiblePosition returning -1 in fragmentgetLastVisiblePosition 在片段中返回 -1
【发布时间】:2013-12-08 14:52:57
【问题描述】:

我有一个 listfragment,它的 listview 是使用来自联系人提供程序的 cursorloader 加载的。

要求:我需要在第一次加载列表视图时使用 view.getLastVisiblePosition() 一次,并且每次有滚动时。

问题:view.getLastVisiblePosition 在 onScrollListener 中有效,但在 onActivityCreated() 或 onCreateView() 或 onViewCreated() 中总是返回 -1。

代码

@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 );
    }

在另一个上下文中,getLastVisiblePosition returning -1 提出了类似的问题。一种解决方案建议在可运行文件中执行 view.getLastVisiblePosition()。但这也为我返回 -1。

【问题讨论】:

  • 您找到解决方案了吗?

标签: android


【解决方案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

             }
         }
     }

【讨论】:

  • 在 onScrollListener 中使用 getLastVisiblePosition() 也适用于我。问题是它在任何生命周期方法 onActivityCreated() 或 onCreateView() 或 onViewCreated() 中都不起作用。也许列表视图仅在这些方法之后的某个时间才被初始化?如果是这样,我想知道它将在哪个生命周期方法中初始化?
  • 你能发布你的活动代码吗,因为我在 onCreateView() 中也使用了同样的东西,它工作得很好
  • 这很奇怪。我已经在问题中发布了代码。 evaluateInviteView() 函数是我调用getLastVisiblePosition() 的地方。为了简洁起见,我删除了大部分不相关的代码。如果我从 onCreateView() 或 onViewCreated() 调用 evaluateInviteView(),结果是一样的。
  • 您是如何设法访问 onCreateView() 中的列表视图的?如果我在那里执行 getListView(),它只会因“错误膨胀类片段”而崩溃。
  • 我正在使用 customListadapter 填充列表视图和使用 list.setadapter() 的适配器
【解决方案2】:

我也有这个问题,我正在拔头发。解决方案包含在此处:getLastVisiblePosition returning -1

实际填充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...
        }
    }
});

【讨论】:

  • 正如我在问题末尾提到的,使用可运行文件对我不起作用。
猜你喜欢
  • 2011-05-01
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
相关资源
最近更新 更多