我从数据库中检索了文本和图像,并在网格视图中显示它们,即每个网格视图单元格包含一个图像和一个文本。现在我需要对其进行分页,即每页显示4个单元格。我该如何做?非常感谢提供示例链接或代码。
//试试这个 ---
gridView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int i) {
}
@Override
public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (totalItemCount > 0) {
int lastVisibleItem = firstVisibleItem + visibleItemCount;
if (!isLoading && hasMoreItems && (lastVisibleItem == totalItemCount)) {
isLoading = true;
//load more items--
}
}
}
});
希望这可以帮到你。
我在Android培训页面链接 "http://developer.android.com/training/implementing-navigation/index.html" 上找到了一个例子,你可以下载一个名为EffectiveNavigation.zip的示例,对于分页非常有用。从那里,你将获得适配器和其他必要内容的基础知识。
我实现分页网格的方法是:
使用两个布局,其中一个带有分页器。
<android.support.v4.view.ViewPager ...
还有一个用于网格视图
<GridView android:id="@+id/gridview" ...
protected void onPostExecute(String params) {
refresList();
progressDialog.dismiss();
}
我调用refreshItems方法,这将通知pager适配器有些东西已经改变了:"mGridPagerAdapter.notifyDataSetChanged();" 同时,我还调用了一个刷新选项卡的方法来重新计算要显示的选项卡。
public void refrestTabs() {
actionBar.removeAllTabs();
for (int i = 0; i < mGridPagerAdapter.getCount(); i++) {
actionBar.addTab(actionBar.newTab()
.setText(mGridPagerAdapter.getPageTitle(i))
.setTabListener(this));
}
}
我创建了一个扩展FragmentPagerAdapter的GridAdapter,在此处的getItem方法中加载Fragment。
@Override
public Fragment getItem(int i) {
Fragment fragment = new GridListFragment();
Bundle args = new Bundle();
args.putInt(GridListFragment.ARG_SECTION_NUMBER, i);
fragment.setArguments(args);
return fragment;
}
GridListFragment类继承自Fragment,这里可以编写加载所需数组部分的逻辑。 以下是我使用的onCreateView方法:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Bundle args = getArguments();
position = args.getInt(ARG_SECTION_NUMBER);
View view = inflater.inflate(R.layout.comp_grid_view, container, false);
gridView = (GridView) view.findViewById(R.id.gridview);
applicationItems = new ArrayList<ApplicationItem>();
int resID = R.layout.comp_app_list_item;
aa = new ApplicationListItemAdapter(view.getContext(), resID, applicationItems);
gridView.setAdapter(aa);
gridView.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View v, int position,
long id) {
mCallback.onApplicationSelected(applicationItems.get(position));
}}
);
return view;
}
当 onStart 方法被调用时,我会刷新网格,并且我是这样做的:
@Override
public void onStart() {
applicationItems.clear();
AppShortcutApplication appState = ((AppShortcutApplication)getActivity().getApplicationContext());
List<ApplicationItem> l = appState.getCurrentListApplications();
if (l != null){
applicationItems.clear();
applicationItems.addAll(l);
aa.notifyDataSetChanged();
}
super.onStart();
}
我通过应用程序状态传递项目,你可以在这个其他问题链接 "如何在Android应用程序的活动之间传递数据?" 中找到相关信息。
再次声明,这可能不是最佳方法,但我找不到其他更好的方法。
这是我在其中一个应用程序中正在做的事情。希望它能帮到你。
public static int currentPage = 0;
private boolean endOfAlbums = false;
private int lastItem = 0;
albumGrid.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState) {
// Pause fetcher to ensure smoother scrolling when flinging // You can ignore this part
if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_FLING) {
mImageFetcher.setPauseWork(true);
} else {
mImageFetcher.setPauseWork(false);
}
}
@Override
public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
final int _lastItem = firstVisibleItem + visibleItemCount;
if (_lastItem > 0 && totalItemCount > 0)
if (_lastItem == albums.size() && !endOfAlbums && lastItem != _lastItem) {
lastItem = _lastItem;
// Last item is fully visible.
loadAlbums();
}
}
});
return view;
}
private void loadAlbums() {
if (currentPage == 0) {
albums.clear();
endOfAlbums = false;
lastItem = 0;
// get new releases
progressLayout.setVisibility(View.VISIBLE);
} else
progressLoadMore.setVisibility(View.VISIBLE);
if (Utility.isNetworkAvailable(getActivity())) {
new Thread(new Runnable() {
@Override
public void run() {
// get the serverAlbums
ArrayList<Album> serverAlbums = ServerAPI.getAllAlbums(session.getLanguage(), currentPage);
if (serverAlbums.size() > 0)
albums.addAll(serverAlbums);
else
endOfAlbums = true;
currentPage++;
myHandler.post(updateRunnable);
}
}).start();
updateRunnable = new Runnable() {
@Override
public void run() {
if (albums.size() > 0) {
imageAdapter.notifyDataSetChanged();
// get listview current position - used to maintain scroll position
int currentPosition = albumGrid.getFirstVisiblePosition();
// Setting new scroll position
albumGrid.smoothScrollToPosition(currentPosition + 1, 0);
} else
tvNoAlbums.setVisibility(View.VISIBLE);
progressLayout.setVisibility(View.GONE);
progressLoadMore.setVisibility(View.GONE);
}
};
} else {
Toast.makeText(getActivity(), R.string.check_connectivity, Toast.LENGTH_SHORT).show();
progressLayout.setVisibility(View.GONE);
progressLoadMore.setVisibility(View.GONE);
}
}
我认为这可能会对你有所帮助。它涵盖了在GridView上显示多个项目的基础知识,并提供了代码示例。