Android ArrayAdapter没有清除?

Android ArrayAdapter没有清除?,第1张

概述我对 Android的ArrayAdapter的自定义实现有一个奇怪的问题.为了给出一些背景知识,我正在尝试更新ListView的内容,同时保留当前的滚动位置. 我有一个服务,它执行一个线程来更新ListView中显示的数据.该数据存储在ArrayList中,ArrayList用于为ListView生成一些自定义ArrayAdapter.按下ListView中的项目(添加或删除项目)时,也会更新适 我对 Android的ArrayAdapter的自定义实现有一个奇怪的问题.为了给出一些背景知识,我正在尝试更新ListVIEw的内容,同时保留当前的滚动位置.

我有一个服务,它执行一个线程来更新ListVIEw中显示的数据.该数据存储在ArrayList中,ArrayList用于为ListVIEw生成一些自定义ArrayAdapter.按下ListVIEw中的项目(添加或删除项目)时,也会更新适配器.我曾经只是在每次有任何类型的更改时创建新适配器,然后将这个新适配器设置为ListVIEw.这很有效,但每次都会导致ListVIEw滚动到顶部.鉴于我的应用程序的性质,这是不可取的.必须在更新之间维护ListVIEw中的当前滚动位置.

我没有创建新的适配器,而是开始使用适配器的clear()方法清除需要更新的适配器,然后使用适配器的add()方法重建适配器的项目.这两种方法都在适配器上调用.适配器都在其构造函数中设置为notifyDataOnChange,因此我不必每次都手动调用notiftyDatasetChanged()(虽然考虑到我的问题,我尝试手动调用它也无济于事).

这是我的自定义适配器的样子:

public class RealmAdapter extends ArrayAdapter<Realm>{    Context c;    public RealmAdapter(Context context,int resource,int textVIEwResourceID)    {                       super(context,resource,textVIEwResourceID);        setNotifyOnChange(true);        c = context;    }    @OverrIDe    public VIEw getVIEw(int position,VIEw convertVIEw,VIEwGroup parent)    {         ...    }...}

长话短说,这是我的问题.当我在适配器上调用clear()时,适配器未被清除.

这是我的线程中的onPostExecute的片段,用于更新.我肯定会把它放在这里,所以它在UI线程上更新.我也在我的UI活动中将这些确切的代码复制到私有方法中.此代码在以下任一位置都不起作用:

appState.favoriteAdapter.clear();Log.d(LOG_TAG,"COUNT: " + appState.favoriteAdapter.getCount());for(Realm r : appState.favorites) {    appState.favoriteAdapter.add(r);}Log.d(LOG_TAG,"COUNT: " + appState.favoriteAdapter.getCount());

例如,如果上面的适配器中有3个项目,则在clear()返回3而不是0之后立即调用getCount().同样,如果appState.favorites ArrayList中只有2个项目,则getCount( )循环仍然返回3,而不是2.因为适配器没有响应任何这些调用,它使得无法以任何方式更新.我可以稍后发布一个Logcat,如果这会有所帮助,但没有例外或任何有用的东西被显示.

几个小时后,我似乎遇到的问题是适配器没有响应对任何改变它的方法的调用.我已经尝试将一个空的ArrayList传递给适配器的super()调用,这没有用.我错过了什么或者错误地使用了ArrayAdapter吗?我已经搜遍了所有的问题,我已经检查了很多常见的问题,例如修改底层数组并期望它更新,而不是调用(或者在我的外壳设置中使用适配器)notifyDatasetChanged(),并使用不支持的对底层集合的 *** 作.

favoriteAdapter的声明非常简单,包含在我的Application类中:

public RealmAdapter favoriteAdapter;

这是从上面初始化favoriteAdapter:

if(appState.favoriteAdapter == null) {    appState.favoriteAdapter = new RealmAdapter(c,R.layout.List_item,R.layout.realm_entry,appState.favorites);}else {    appState.favoriteAdapter.clear();    Log.d(LOG_TAG,"COUNT: " + appState.favoriteAdapter.getCount());    for(Realm r : appState.favorites) {        appState.favoriteAdapter.add(r);    }    Log.d(LOG_TAG,"COUNT: " + appState.favoriteAdapter.getCount());}

上面的代码在我的UI线程和下载刷新数据的线程中.

在上面的代码下面放置了一个过滤器:

if(appState.favoriteAdapter != null && RealmSelector.realmFilter != null)                   appState.favoriteAdapter.getFilter().filter(RealmSelector.realmFilter.getText().toString());

过滤器会影响清除列表吗?逻辑不会决定……

解决方法 我将过滤器应用于自定义ArrayAdapter.显然这会干扰添加和删除适配器本身的项目?我将此代码添加到我的方法中,它现在正在工作:

if(appState.favoriteAdapter != null && realmFilter != null) {     appState.favoriteAdapter.getFilter().filter(realmFilter.getText().toString());}

如果有人能解释为什么这很重要,我会很高兴.我认为过滤器是为了选择适配器中的项目子集.在我的测试中,我将用于过滤器的文本框留空,因此不应该应用实际的过滤器文本.再说一次,如果有人知道发生了什么,可以向我解释为什么这样可以解决我想知道的问题.

总结

以上是内存溢出为你收集整理的Android ArrayAdapter没有清除?全部内容,希望文章能够帮你解决Android ArrayAdapter没有清除?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1124400.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存