Jos*_*ger 268
一种解决方案是在其方法中以方便的状态实现OnScrollListener
并进行更改(例如添加项目等).ListAdapter
onScroll
下面ListActivity
显示了一个整数列表,从40开始,在用户滚动到列表末尾时添加项目.
public class Test extends ListActivity implements OnScrollListener {
Aleph0 adapter = new Aleph0();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setListAdapter(adapter);
getListView().setOnScrollListener(this);
}
public void onScroll(AbsListView view,
int firstVisible, int visibleCount, int totalCount) {
boolean loadMore = /* maybe add a padding */
firstVisible + visibleCount >= totalCount;
if(loadMore) {
adapter.count += visibleCount; // or any other amount
adapter.notifyDataSetChanged();
}
}
public void onScrollStateChanged(AbsListView v, int s) { }
class Aleph0 extends BaseAdapter {
int count = 40; /* starting amount */
public int getCount() { return count; }
public Object getItem(int pos) { return pos; }
public long getItemId(int pos) { return pos; }
public View getView(int pos, View v, ViewGroup p) {
TextView view = new TextView(Test.this);
view.setText("entry " + pos);
return view;
}
}
}
Run Code Online (Sandbox Code Playgroud)
显然,您应该为长时间运行的操作(例如加载Web数据)使用单独的线程,并且可能希望在最后一个列表项中指示进度(如市场或gmail应用程序那样).
sas*_*oar 94
只是想贡献我用于我的应用程序的解决方案.
它也基于OnScrollListener
接口,但我发现它在低端设备上具有更好的滚动性能,因为在滚动操作期间没有执行任何可见/总计数计算.
ListFragment
或ListActivity
实施OnScrollListener
将以下方法添加到该类:
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
//leave this empty
}
@Override
public void onScrollStateChanged(AbsListView listView, int scrollState) {
if (scrollState == SCROLL_STATE_IDLE) {
if (listView.getLastVisiblePosition() >= listView.getCount() - 1 - threshold) {
currentPage++;
//load more list items:
loadElements(currentPage);
}
}
}
Run Code Online (Sandbox Code Playgroud)
currentPage
应该添加到列表中的数据源页面在哪里,是threshold
列表项的数量(从末尾开始计算),如果可见,则应触发加载过程.如果设置threshold
到0
,例如,用户滚动到列表的最末端,以装载更多的物品.
(可选)如您所见,只有在用户停止滚动时才会调用"load-more check".为了提高可用性,您可以通过扩充并在列表末尾添加加载指示符listView.addFooterView(yourFooterView)
.这种页脚视图的一个示例:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/footer_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="10dp" >
<ProgressBar
android:id="@+id/progressBar1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_gravity="center_vertical" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/progressBar1"
android:padding="5dp"
android:text="@string/loading_text" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)(可选)最后,listView.removeFooterView(yourFooterView)
如果没有更多项目或页面,则通过调用删除该加载指示符.
Dar*_*ski 20
您可以在onScrollListener的帮助下检测列表的末尾,工作代码如下所示:
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (view.getAdapter() != null && ((firstVisibleItem + visibleItemCount) >= totalItemCount) && totalItemCount != mPrevTotalItemCount) {
Log.v(TAG, "onListEnd, extending list");
mPrevTotalItemCount = totalItemCount;
mAdapter.addMoreData();
}
}
Run Code Online (Sandbox Code Playgroud)
另一种方法(内部适配器)如下:
public View getView(int pos, View v, ViewGroup p) {
if(pos==getCount()-1){
addMoreData(); //should be asynctask or thread
}
return view;
}
Run Code Online (Sandbox Code Playgroud)
请注意,此方法将被多次调用,因此您需要添加另一个条件来阻止多次调用addMoreData()
.
当您将所有元素添加到列表中时,请在您的适配器内调用notifyDataSetChanged()来更新View(它应该在UI线程上运行 - runOnUiThread)
归档时间: |
|
查看次数: |
112477 次 |
最近记录: |