【问题标题】:Android: Using EndlessScrollListener in listview just keeps on loading data when scrolled upAndroid:在列表视图中使用 EndlessScrollListener 只是在向上滚动时继续加载数据
【发布时间】:2014-09-07 06:47:26
【问题描述】:

这是我的 EndLessScrollListener.java。有没有人遇到过这个问题,你向上滚动并且它一直滚动到列表的顶部。我正在构建一个类似于用于聊天消息的环聊的应用程序,其中最新消息就在底部。因此,要查看较旧的聊天消息,用户向上滚动并继续向右滚动到顶部。请帮忙。仅供参考,我在我的 listView 中使用这两个属性: 机器人:stackFromBottom="真" android:transcriptMode="正常"

import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;

/*
 * https://github.com/thecodepath/android_guides/wiki/Endless-Scrolling-with-AdapterViews
 */
public abstract class EndlessScrollListener implements OnScrollListener {
    // The minimum amount of items to have below your current scroll position
    // before loading more.
    private int visibleThreshold = 5;
// The current offset index of data you have loaded
private int currentPage = 0;
// The total number of items in the dataset after the last load
private int previousTotalItemCount = 0;
// True if we are still waiting for the last set of data to load.
private boolean loading = true;
// Sets the starting page index
private int startingPageIndex = 0;
private boolean reverse = false;

public EndlessScrollListener() {
}

public EndlessScrollListener(int visibleThreshold) {
    this.visibleThreshold = visibleThreshold;
}

public EndlessScrollListener(int visibleThreshold, boolean reverse) {
    this.visibleThreshold = visibleThreshold;
    this.reverse = reverse;
}

public EndlessScrollListener(int visibleThreshold, int startPage) {
    this.visibleThreshold = visibleThreshold;
    this.startingPageIndex = startPage;
    this.currentPage = startPage;
}

// This happens many times a second during a scroll, so be wary of the code you place        here.
// We are given a few useful parameters to help us work out if we need to load some more    data,
// but first we check if we are waiting for the previous load to finish.
@Override
public void onScroll(AbsListView view,int firstVisibleItem,int visibleItemCount,int   totalItemCount) {
    // If the total item count is zero and the previous isn't, assume the
    // list is invalidated and should be reset back to initial state
    if (totalItemCount < previousTotalItemCount) {
        this.currentPage = this.startingPageIndex;
        this.previousTotalItemCount = totalItemCount;
        if (totalItemCount == 0) { this.loading = true; } 
    }

    // If it's still loading, we check to see if the dataset count has
    // changed, if so we conclude it has finished loading and update the current page
    // number and total item count.
    if (loading && (totalItemCount > previousTotalItemCount)) {
        loading = false;
        previousTotalItemCount = totalItemCount;
        currentPage++;
    }

    // If reverse then the firstVisibleItem is calculated wrong
    if (reverse) {
        firstVisibleItem = totalItemCount - firstVisibleItem;
    }
    // If it isn't currently loading, we check to see if we have breached
    // the visibleThreshold and need to reload more data.
    // If we do need to reload some more data, we execute onLoadMore to fetch the data.
    if (!loading && (totalItemCount - visibleItemCount)<=(firstVisibleItem + visibleThreshold)) {
        onLoadMore(currentPage + 1, totalItemCount);
        loading = true;
    }
}

// Defines the process for actually loading more data based on page
public abstract void onLoadMore(int page, int totalItemsCount);

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
    // Don't take any action on changed
}

public void reset() {
    currentPage = 0;
    previousTotalItemCount = 0;
    loading = true;
    startingPageIndex = 0;
}
}

This is my xml file.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/background"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<RelativeLayout
    android:id="@+id/sendMessageLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:minHeight="48dp" >

    <com.android.volley.toolbox.NetworkImageView
        android:id="@+id/image"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="8dp" />

    <ImageView
        android:id="@+id/sendMessage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="4dp"
        android:background="?android:attr/selectableItemBackground"
        android:padding="8dp"
        android:src="@drawable/convo_send" />

    <EditText
        android:id="@+id/message"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="48dp"
        android:layout_toLeftOf="@+id/sendMessage"
        android:background="@android:color/transparent"
        android:hint="New message"
        android:inputType="textMultiLine|textCapSentences"
        android:textColor="@android:color/black"
        android:textColorHint="@color/g3"
        android:textSize="@dimen/sp_17" />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_alignParentTop="true"
        android:background="#DBDCDC" />
</RelativeLayout>

    <ListView
        android:id="@+id/conversation"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/sendMessageLayout"
        android:cacheColorHint="@android:color/transparent"
        android:choiceMode="multipleChoice"
        android:descendantFocusability="afterDescendants"
        android:divider="@android:color/transparent"
        android:dividerHeight="3dp"
        android:paddingBottom="6dp"
        android:scrollbars="none"
        android:stackFromBottom="true"
        android:transcriptMode="normal"
        tools:listitem="@layout/conversation_text" />

</RelativeLayout>

【问题讨论】:

    标签: java android endlessscroll


    【解决方案1】:

    我已经用这段代码解决了这个问题

        if (view.isStackFromBottom()) {
            if (!loading && firstVisibleItem == 0 ) {
                onLoadMore(currentPage + 1, totalItemCount);
                loading = true;
            }
        }
    
        else if (!loading && (totalItemCount - visibleItemCount)<=(firstVisibleItem + visibleThreshold)) {
            onLoadMore(currentPage + 1, totalItemCount);
            loading = true;
        }
    

    当 onLoadMore 成功处理新数据时,我滚动到前一个第一项以防止 onScroll 被 firstVisibleItem = 0 调用

        ListItemObject firstObject = mAdapter.getItem(0);
        mAdapter.addAll(0, resultsObject);
    
        int index = mAdapter.indexOf(firstObject);
                        // Scroll to the previous first item position to avoid
                        // Calling onLoadMore again
         if (index != -1) {
                  mMessagesListView.setSelection(index);
         }
    

    【讨论】:

      猜你喜欢
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      • 2015-03-02
      • 2015-08-12
      相关资源
      最近更新 更多