Why do I not need to use Adapter.notifyDataSetChanged()?(为什么我不需要使用Adapter.nufyDataSetChanged()?)
问题描述
contactsList
在readContacts()
方法执行前为空,即contactsView.setAdapter(adapter)
执行时contactsList
为空,为什么此代码仍能正确显示联系人信息?
public class MainActivity extends AppCompatActivity {
ListView contactsView;
ArrayAdapter<String> adapter;
List<String> contactsList = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contactsView = (ListView) findViewById(R.id.contacts_list);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, contactsList);
contactsView.setAdapter(adapter);
readContacts();
}
private void readContacts() {
Cursor cursor = null;
try {
cursor = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null, null, null, null);
while (cursor.moveToNext()) {
String displayName = cursor.getString(cursor.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
));
String number = cursor.getString(cursor.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER
));
contactsList.add(displayName + "
" + number);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
}
}
但是如果我添加这样的内容,我必须调用notifyDataSetChanged()
:
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
contactsList.add("blabla");
adapter.notifyDataSetChanged();
}
});
add
是按钮。
既然Android会自动调用该方法,为什么移除adapter.notifyDataSetChanged();
的时候UI不能刷新?
推荐答案
重点是输入数据的顺序,即当您按下列表中的一项时,它一直向下,您没有在4号、5号任何随机索引中输入它,因此您不必调用notifyDataSetChanged()
,正如其定义本身所说:某些数据已被更改或任何反映该数据集的视图应刷新自身以使新数据在列表上可见由于在这种情况下,数据超出了可见列表的范围,即列表中显示的子项的数量,因此它(ListView)始终调用ListView中最后显示的那个特定索引值(Item)之后的下一个视图。!
希望我已经向您解释清楚了...!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 在您编辑问题后,在搜索和对此方面有自己的想法和理解后回答:
在第一种情况下,不需要更改视图。对。? 如果你对这一点很清楚,那么第二个就来吧。首先,您从数据库获取数据,然后在列表中添加一项,然后在设置适配器后填充它。!!直到整个方法执行并完成列表后,才会设置适配器。!好的。
但在第二个场景中,您正在更改视图(在Android中几乎所有东西都是View),因此您是通过在已填充的View(已有设置的适配器)上添加另一项来操作视图,因此这一次您需要告诉该视图,嘿,我已在您的视图中添加了一项。现在刷新您自己,然后更新列表(即Display)。
这篇关于为什么我不需要使用Adapter.nufyDataSetChanged()?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么我不需要使用Adapter.nufyDataSetChanged()?
基础教程推荐
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01
- android 应用程序已发布,但在 google play 中找不到 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01