Android中的Gridview分页

3
我从数据库中检索了文本和图像,并在网格视图中显示它们,即每个网格视图单元格包含一个图像和一个文本。现在我需要对其进行分页,即每页显示4个单元格。我该如何做?非常感谢提供示例链接或代码。
4个回答

2

//试试这个 ---

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--

                }
            }
        }
    });

0

希望这可以帮到你。

我在Android培训页面链接 "http://developer.android.com/training/implementing-navigation/index.html" 上找到了一个例子,你可以下载一个名为EffectiveNavigation.zip的示例,对于分页非常有用。从那里,你将获得适配器和其他必要内容的基础知识。

我实现分页网格的方法是:

使用两个布局,其中一个带有分页器。

<android.support.v4.view.ViewPager ...

还有一个用于网格视图

<GridView  android:id="@+id/gridview" ... 

注意:如果网格布局被包含在其他组件中,我会遇到问题。
我在Activity中加载分页器,在这里你可以像Android培训示例一样加载分页器,我不在这里添加信息,因为它已经很好地解释了。在这里,我还有我的逻辑来加载项目数组,在这种情况下,你可以从JSON响应中加载它们,我使用AsyncTask完成它:
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应用程序的活动之间传递数据?" 中找到相关信息。

再次声明,这可能不是最佳方法,但我找不到其他更好的方法。


0

这是我在其中一个应用程序中正在做的事情。希望它能帮到你。

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);
            }

        }

-1

我认为这可能会对你有所帮助。它涵盖了在GridView上显示多个项目的基础知识,并提供了代码示例。

Android GridView开发指南


这个链接帮助我在GridView中显示图片。但是我需要进行分页。 - sanjay

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