为什么我不需要使用Adapter.nufyDataSetChanged()? [英] Why do I not need to use Adapter.notifyDataSetChanged()?

查看:246
本文介绍了为什么我不需要使用Adapter.nufyDataSetChanged()?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

contactsListreadContacts()方法执行前为空,即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()?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆