【问题标题】:Pagination listview in large data loading in AndroidAndroid中大数据加载中的分页列表视图
【发布时间】:2013-07-19 17:31:26
【问题描述】:

我有一个数据库,并且正在将数据从该数据库加载到列表视图中。在用户将列表视图滚动到最后以从数据库中获取另外 20 个项目并添加到列表视图后,我写从数据库中获取 20 个项目,但是在加载到列表视图时加载一两个项目时出现问题;我在列表视图中看不到任何数据。我的代码是:

private ListviewAdapter adapter;
list.setOnScrollListener(new OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView arg0, int arg1) {

    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, final int totalItemCount) {
        if (totalItemCount > 0)
        {
            int lastInScreen = firstVisibleItem + visibleItemCount;
            if(lastInScreen == totalItemCount)
            {
                Parcelable state = list.onSaveInstanceState();

                //Fill my_array
                adapter = new ListviewAdapter(MainActivity.this, my_array);
                list.setAdapter(adapter);
                list.onRestoreInstanceState(state);
            }
        }
    }
});

当加载的数据大于屏幕时,它可以正常工作,但是当加载的数据小于屏幕时,我在列表视图中看不到任何内容。

我该如何解决这个问题?

【问题讨论】:

  • 加载新数据后,您是否在列表视图上调用notifyDataSetChanged
  • 不,我删除了我的数组项并再次填充数组并设置 listview 适配器。你瘦我从数据库中获取搜索查询,必须删除之前的数据并获取新数据。

标签: android pagination


【解决方案1】:

只需将适配器作为类变量,并将适配器设置在onCreate(..) 当您到达 ListView 的末尾并更新列表视图时,只需清除 my_array.clear(); 然后向其中添加数据并通知 Listview 适配器。

示例代码:

Class myclass extends Activity
{
 private ListviewAdapter adapter;
 private ArrayList<String> my_array;

 onCreate(...)
  {
   //Fill Values in the Array
   my_array.add(...);
   adapter = new ListviewAdapter(MainActivity.this, my_array);
   list.setAdapter(adapter);
   ....

   //In your onScrollListener() of the list make the following changes
   list.setOnScrollListener(new OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView arg0, int arg1) {

    }
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, final int totalItemCount) {
        if (totalItemCount > 0)
        {
            int lastInScreen = firstVisibleItem + visibleItemCount;
            if(lastInScreen == totalItemCount)
            {
                my_array.clear();
                //Add the values in you Array here.
                my_array.add(....)
                //Notify the adapter about the data set change.
                adapter.notifyDatasetChanged();
            }
        }
    }
});

编辑
对于列表视图中未检测到的按钮点击问题。
只需在自定义列表视图的布局文件中设置 onClick 属性即可。

<Button
        ......
        android:onClick="btnRemoveClick"
        />

在你的 onClick 方法中,做点击事件的实现。

public void btnRemoveClick(View v)
{
    //get the position of the button here
    final int position = listviewItem.getPositionForView((View) v.getParent()); 
}

P.S:你需要将 ListView 对象设置为类变量。

【讨论】:

  • 这是可行的,但有一个问题!
    当编辑框被填充以进行搜索时,我无法使用 lontouch 列表视图来选择或无法单击自定义布局中列表视图内部的图像按钮,但是当编辑框为空时,所有功能都像 longtouch 或每行可点击的图像按钮。
  • 我花了一段时间才明白你的意思,没关系。这是您其他问题的解决方案。 stackoverflow.com/questions/7763983/…
  • 在我测试这个之前,不要为我工作。你的代码对我来说工作得很好但是当我使用adapter.notify ......我无法选择一行listview或longtouch listview项目,当我输入edittext进行搜索时,当我清除edittext文本时会出现这个问题我无法选择行或长按!
  • 我错了,我不知道何时使用通知滚动位置自动保存,我删除此行要保存位置 Parcelable state = list.onSaveInstanceState();而这个恢复滚动代码 list.onRestoreInstanceState(state);谢谢。
猜你喜欢
  • 2013-07-27
  • 1970-01-01
  • 2015-01-06
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 2013-02-06
相关资源
最近更新 更多