gpt4 book ai didi

android - 当用户到达底部时从 JSON 动态填充 ListView

转载 作者:太空狗 更新时间:2023-10-29 16:17:12 25 4
gpt4 key购买 nike

我正在通过 JSON 填充 ListView。我用 this tutorial 完成了它.

我面临的唯一问题是:我想在用户到达 ListView 末尾时加载更多项目,我不想在开头加载 100 个项目。我想显示 10 个项目,然后再显示 10 个项目。我该怎么做?

最佳答案

请按照以下步骤操作:-
大多数代码都有注释,因此您可以了解每条语句的作用。

将 FooterView 添加到 ListView

页脚 View 只不过是一段 XML,它定义了 ListView 页脚的外观。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:gravity="center_horizontal"
android:padding="3dp"
android:layout_height="fill_parent">
<TextView
android:id="@id/android:empty"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="center"
android:padding="5dp"
android:text="Loading more days..."/>
</LinearLayout>

它只是一个带有用于演示目的的消息的简单 TextView 。但是你可以在这里放任何东西:-)

将 View 添加到 ListView 并不难。您唯一需要注意的是,您将它放在将适配器添加到 View 的行上方!我们将使用此代码将其添加到我们的 ListView:addFooterView(View)

 //add the footer before adding the adapter, else the footer will not load!
View footerView = ((LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.listfooter, null, false);
this.getListView().addFooterView(footerView);

现在是有趣的部分,检查我们是否一直向下并加载项目

Java 实现

实际加载是在单独的线程(Runnable)中完成的。这样我们就不会锁定主界面 (GUI)。

//Here is where the magic happens
this.getListView().setOnScrollListener(new OnScrollListener(){
//useless here, skip!
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {}
//dumdumdum
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
//what is the bottom iten that is visible
int lastInScreen = firstVisibleItem + visibleItemCount;
//is the bottom item visible & not loading more already ? Load more !
if((lastInScreen == totalItemCount) && !(loadingMore)){
Thread thread = new Thread(null, loadMoreListItems);
thread.start();
}
}
});

实现 Runnables 来处理加载

加载由 2 个 Runnables 完成。第一个可运行的 loadMoreListItems 被调用以获取数据,第二个可运行的 returnRes 在主 (UI) 线程上被调用以更新界面。要从第一个切换到第二个,我们使用名为的方法:runOnUiThread

这是实现 Runnable 的代码,我尽可能多地注释了代码以使其易于理解:

可运行以加载项目

   private Runnable loadMoreListItems = new Runnable() {
@Override
public void run() {
//Set flag so we cant load new items 2 at the same time
loadingMore = true;
//Reset the array that holds the new items
myListItems = new ArrayList<String>();
//Simulate a delay, delete this on a production environment!
try { Thread.sleep(1000);
} catch (InterruptedException e) {}
//Get 15 new listitems
for (int i = 0; i < itemsPerPage; i++) {
//Fill the item with some bogus information
myListItems.add("Date: " + (d.get(Calendar.MONTH)+ 1) + "/" + d.get(Calendar.DATE) + "/" + d.get(Calendar.YEAR) );
// +1 day
d.add(Calendar.DATE, 1);
}
//Done! now continue on the UI thread
runOnUiThread(returnRes);
}
};

第二个Runnable:因为我们不能从一个线程更新我们的 UI,这个 Runnable 会处理这个!

private Runnable returnRes = new Runnable() {
@Override
public void run() {
//Loop thru the new items and add them to the adapter
if(myListItems != null && myListItems.size() > 0){
for(int i=0;i < myListItems.size();i++)
adapter.add(myListItems.get(i));
}
//Update the Application title
setTitle("Neverending List with " + String.valueOf(adapter.getCount()) + " items");
//Tell to the adapter that changes have been made, this will cause the list to refresh
adapter.notifyDataSetChanged();
//Done loading more.
loadingMore = false;
}
};

关于android - 当用户到达底部时从 JSON 动态填充 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24103799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com