当ScrollView滚动到底部时加载更多数据。

6
我是一位有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我有一个scrollView,其中包含动态加载内容。有时可能会有很多内容,因此当用户滚动到底部时,我想要加载更多。

我搜索了适合的方法,并找到了两种:

onScrollChanged() 

并且

getScrollY()

但是我不知道如何将其用于我的目的。请给我一些建议。


3
为什么不使用 ListView?这是它的作用。 - codeMagic
我需要一些视图配置,以便像Pinterest一样显示照片,但listview不允许。 - TpoM6oH
我不使用Pinterest,所以我不知道它们的布局,但我正在开发一些东西,可以让你拍照并在ListView中显示它。就像海绵宝宝说的那样,想象力可以创造无限可能,是的,我有孩子 :) - codeMagic
@codeMagic 想象力加一! - Ge Rong
2个回答

12

滚动视图没有提供任何方法来检查是否已到达视图底部,因此最好的技术是使用滚动视图扩展自己的自定义视图。这就是我在我的应用程序中实现的方式。

步骤1:创建一个自定义滚动视图类

public class ObservableScrollView extends ScrollView {

private ScrollViewListener scrollViewListener = null;

public ObservableScrollView(Context context) {
    super(context);
}

public ObservableScrollView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public ObservableScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public void setScrollViewListener(ScrollViewListener scrollViewListener) {
    this.scrollViewListener = scrollViewListener;
}

@Override
protected void onScrollChanged(int x, int y, int oldx, int oldy) {

    View view = (View) getChildAt(getChildCount() - 1);
    int diff = (view.getBottom() - (getHeight() + getScrollY()));
    if (diff == 0) { // if diff is zero, then the bottom has been reached
        if (scrollViewListener != null) {
            scrollViewListener.onScrollEnded(this, x, y, oldx, oldy);
        }
    }
    super.onScrollChanged(x, y, oldx, oldy);
}

}

步骤2:创建一个滚动视图监听器接口

public interface ScrollViewListener {

void onScrollEnded(ObservableScrollView scrollView, int x, int y, int oldx, int oldy);



 }

步骤 3:将视图添加到您的布局中

   <com.platinumapps.facedroid.ObservableScrollView
        android:id="@+id/scrollView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </com.platinumapps.facedroid.ObservableScrollView>

步骤四:在你的类中实现该接口

  public class MyFragment extends Fragment implements ScrollViewListener 

@Override
public void onScrollEnded(ObservableScrollView scrollView, int x, int y, int oldx,   int oldy) {

           //Perform your action
}

你已经完成了


无法获取差异,直接获得的差异小于0。 - Krunal Shah

7

我认为更好的方法是使用ListView,但如果你只需要ScrollView

首先,您可以固定ScrollView的阈值高度,这样每当您超过该限制时,加载新数据并将其附加到ScrollView中,并重置您的阈值高度。

您可以尝试如下方式:

创建一个类似于以下的自定义ScrollView

public class ObservableScrollView extends ScrollView
{

    private ScrollViewListener scrollViewListener = null;

    public ObservableScrollView(Context context)
    {
        super(context);
    }

    public ObservableScrollView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    public ObservableScrollView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public void setScrollViewListener(ScrollViewListener scrollViewListener)
    {
        this.scrollViewListener = scrollViewListener;
    }

    @Override
    protected void onScrollChanged(int x, int y, int oldx, int oldy)
    {
        super.onScrollChanged(x, y, oldx, oldy);
        if (scrollViewListener != null)
        {
            scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
        }
    }

}

然后创建一个接口

public interface ScrollViewListener 
{
    void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy);
}

& 您的 XML 布局应该像这样

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.solve.stackoverflow.ObservableScrollView
        android:id="@+id/endless_scrollview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <LinearLayout
            android:id="@+id/endless_scrollview_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" />
    </com.solve.stackoverflow.ObservableScrollView>

</LinearLayout>

&最后在您的活动中使用所有这些

public class EndLessActivity extends Activity implements ScrollViewListener
{
    ObservableScrollView scrollView;
    LinearLayout layout;

    int threshold = 20; //Setting threshold 

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.endless_scrollview);
        scrollView = (ObservableScrollView) findViewById(R.id.endless_scrollview);
        layout = (LinearLayout) findViewById(R.id.endless_scrollview_layout);
        scrollView.setScrollViewListener(this);
        appendData();
    }

    @Override
    public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy)
    {
        // TODO Auto-generated method stub
        if (y > threshold)
             appendData();
    }

    void appendData()
    {
        for (int i = 0; i < 15; i++)
        {
            threshold += 10;//Reseting threshold.
            TextView tv = new TextView(this);
            tv.setBackgroundResource(R.drawable.ic_launcher);
            layout.addView(tv);
        }
    }
}

尝试一下这个,让我知道它是否解决了你的问题。谢谢。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接