标签: endlessadapter

使用反向无限滚动添加到ListView时保持滚动位置

我正在构建类似聊天的Android应用程序,类似于环聊.为此,我使用带有stackFromBottom=true和的垂直ListView transcriptMode="normal".

该列表从较旧的消息(顶部)到较年轻的消息(底部)排序.在正常状态下,ListView会滚动到底部,显示最年轻的消息.

一旦用户滚动到列表顶部,ListView使用反向无限滚动适配器来加载更多(较旧的)消息.加载旧邮件后,它们将添加到列表顶部.

所需的行为是,当旧消息添加到其顶部时,ListView将其滚动位置保持在列表的底部.也就是说,当较旧的消息添加到顶部时,滚动视图应显示在添加旧消息之前显示的相同消息.

不幸的是,这不起作用.ListView不是将滚动位置保持在底部,而是将滚动位置保持在列表顶部.也就是说,在将较旧的消息添加到列表之后,该列表显示最顶层(即最旧的)消息.

在将新项目添加到顶部时,是否有一种简单的方法可以告诉ListView将其滚动位置保持在底部而不是顶部?

更新

出于演示目的,我尽可能地减少了用例和代码.以下示例创建一个简单的字符串数组列表.单击某个项目将在列表顶部添加另一个项目.长按单击某个项目将在列表底部添加另一个项目.

在列表底部添加项目时,一切正常(长按).在列表顶部添加项目(简单点击),则有3种情况:

  • 如果列表滚动到底部,那么一切正常.将项目添加到顶部后,列表仍会滚动到底部.
  • 如果列表未滚动到底部(也不滚动到顶部),则列表将保持其滚动y位置(从顶部开始).这使列表看起来"跳"了一个项目.我希望列表不要在这种情况下"跳起来",即我希望它从底部保持其滚动y位置.
  • 如果列表滚动到顶部,则情况与情况2相同.首选行为与情况2相同.

(最后两个案例实际上是相同的.我把它们分开了,因为在案例2中可以更好地证明这个问题.)

public class MyListActivity extends Activity {
  int topIndex = 1;

  int bottomIndex = 20;

  protected final void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_list_activity);

    final ListView list = (ListView) findViewById(R.id.list);
    list.setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);
    list.setStackFromBottom(true);

    final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1);
    for (int i = topIndex; i <= bottomIndex; i++) {
      adapter.add(Integer.toString(i));
    }
    list.setAdapter(adapter);

    list.setOnItemClickListener(new OnItemClickListener() {
      @Override
      public void onItemClick(AdapterView<?> …
Run Code Online (Sandbox Code Playgroud)

android listview scroll endlessadapter

17
推荐指数
1
解决办法
5051
查看次数

Android无限滚动网格,适配器是否必须无限增长?

我在Android上实现了一个简单的无限滚动GridView.我有以下组件:

  1. 一个带有onScrollListener的GridView,每当GridView滚动到最底层时,我就会启动AsyncTask以将更多项目加载到我的Adapter中.
  2. 一个适配器,它附加从AsyncTask获取的项,并触发notifyDataChanged(),以便GridView可以自行刷新.

这似乎工作得很好,除非在这种情况下适配器无限增长...我的意思是每当用户滚动到最后时我会继续向这个适配器附加项目,这似乎是一个内存问题.

实现无限适配器的正确方法是什么?我正在寻找概念,而不是为我做这件事的第三方罐子.

谢谢

解决方案
明确的答案有正确的理论.我对它的实现将加载的数据备份到sqllite数据库中,因此总体流程是:在线程中从Internet下载数据,解析并将数据存储到线程中的数据库中,在UI线程上触发notifyDataChanged.
适配器的getCount()方法只是从数据库中执行select count(id),它会立即从数据库中检索一批对象到内存中供适配器使用.

android android-adapter infinite-scroll endlessadapter

5
推荐指数
1
解决办法
1707
查看次数