案头见蠹鱼,犹胜凡俦侣。这篇文章主要讲述更改了arraylist时,ArrayList和ListView的Android数组适配器不会更新相关的知识,希望能为你提供帮助。
我有一个android应用程序,其屏幕包含一个ListView,我用它来显示设备列表。这些设备保存在一个阵列中。
我正在尝试使用ArrayAdapter在列表中的屏幕上显示数组中的内容。
它在我第一次加载SetupActivity类时有效,但是,可以在addDevice()方法中添加新设备,这意味着更新了保存设备的阵列。
我正在使用notifyDataSetChanged(),它应该更新列表,但它似乎不起作用。
public class SetupActivity extends Activity
{
private ArrayList<
Device>
deviceList;
private ArrayAdapter<
Device>
arrayAdapter;
private ListView listView;
private DevicesAdapter devicesAdapter;
private Context context;
public void onCreate(Bundle savedInstanceState)//Method run when the activity is created
{
super.onCreate(savedInstanceState);
setContentView(R.layout.setup);
//Set the layoutcontext = getApplicationContext();
//Get the screenlistView = (ListView)findViewById(R.id.listView);
deviceList = new ArrayList<
Device>
();
deviceList = populateDeviceList();
//Get all the devices into the listarrayAdapter = new ArrayAdapter<
Device>
(this, android.R.layout.simple_list_item_1, deviceList);
listView.setAdapter(arrayAdapter);
}protected void addDevice()//Add device Method (Simplified)
{
deviceList = createNewDeviceList();
//Add device to the list and returns an updated listarrayAdapter.notifyDataSetChanged();
//Update the list
}
}
任何人都可以看到我错在哪里?
答案对于ArrayAdapter,只有在适配器上使用
notifyDataSetChanged
,add
,insert
和remove
函数时,clear
才有效。- 使用clear清除适配器 -
arrayAdapter.clear()
- 使用Adapter.addAll并添加新形成的列表 -
arrayAdapter.addAll(deviceList)
- 调用notifyDataSetChanged
- 在新的设备列表形成后重复此步骤 - 但这是多余的
arrayAdapter = new ArrayAdapter< Device> (this, android.R.layout.simple_list_item_1, deviceList);
- 创建自己的派生自BaseAdapter和ListAdapter的类,为您提供更大的灵活性。这是最值得推荐的。
notifyDataSetChanged()
仅在适配器上调用add
,insert
,remove
或clear
时才有效。这种解释适用于setNotifyOnChange()
方法,如果设置为true(默认情况下),则会在发生这四种操作中的任何一种时自动调用notifyDataSetChanged()
。我认为这张海报混淆了这两种方法。 notifyDatasetChanged()
本身没有这些限制。它只是告诉适配器它正在查看的列表已经改变,并且列表的更改实际上是如何发生的并不重要。虽然我看不到你的createNewDeviceList()
的源代码,我猜你的问题来自于你有适配器引用你创建的原始列表,然后你在createNewDeviceList()
中创建了一个新列表,并且因为适配器仍然是指向旧列表,它无法看到更改。提到的解决方案slartibartfast之所以有效,是因为它清除了适配器并专门将更新的列表添加到该适配器。因此,您没有适配器指向错误位置的问题。希望这有助于某人!另一答案【更改了arraylist时,ArrayList和ListView的Android数组适配器不会更新】您的方法和设备正在导致无限循环。不要像在这里一样调用自己的方法:
deviceList = addDevice();
推荐阅读
- Android ListView固定高度项
- Android(requestLayout()调用不当)
- CardView在Android L中没有显示Shadow
- 如何在Android中使用Appcelerator Titanium构建Oauth 2.0
- Android上的Spring OAuth2异常(在路径上找不到类“javax.xml.transform.stax.StAXSource”:DexPathList)
- Linkedin signin(无法检索访问令牌:appId或重定向uri与授权代码或授权代码已过期不匹配)
- Flutters资源加载速度比原生Android快
- 如何解决Symfony 4中的KnpPaginator异常(即使应用容器中存在服务”knp_paginator”,也找不到)
- 如何在C#中将Unixtime转换为DateTime类,反之亦然