【问题标题】:Why do I not need to use Adapter.notifyDataSetChanged()?为什么我不需要使用 Adapter.notifyDataSetChanged()?
【发布时间】:2016-01-16 12:04:43
【问题描述】:

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 + "\n" + 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无法刷新?

【问题讨论】:

    标签: android android-listview android-adapter notifydatasetchanged


    【解决方案1】:

    该方法在 Android 框架内部调用。您不必显式调用它。

    来源:https://www.udacity.com/course/developing-android-apps--ud853

    【讨论】:

    • 我的意思是当我设置适配器时,列表是空的。在我使用readcontacts 之后,列表变得不为空,但我没有使用notifydatachanged() 来刷新它。那为什么列表视图仍然可以显示信息?
    • @HungryMilk 当列表内容发生变化时,Android 框架会自动调用notifyDataChanged()。所以你不必自己调用它。
    • 谢谢!但我有一个新问题,在上面刷新:)
    【解决方案2】:

    关键是您在订单中输入数据,即当您在列表中推送一个项目时,它会一直向下,您没有在第 4 位、第 5 位输入任何随机索引,所以您不必调用notifyDataSetChanged(),因为它的定义本身说:某些数据已被更改或任何反映数据集的视图应自行刷新以使新数据在列表中可见,因为在这种情况下,数据超出了可见列表的范围,即列表中显示的子项的数量,因此它(ListView)总是在该特定最后显示的索引之后调用 next 视图listView 中的值(项)!

    希望我让你明白一点......!

    ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++ 在您编辑问题后,在搜索并对此有自己的想法和理解后回答:

    在第一种情况下,不需要对 VIEW 进行任何更改。对吧。? 如果这一点对你来说很清楚,那么就来第二个。首先,您从数据库中获取数据,然后在列表中添加一个项目,然后在设置适配器后填充它。!!在整个方法执行并完成列表之前没有设置适配器..!好的。

    但在第二种情况中,您正在更改视图(几乎所有内容都是 android 中的视图),因此您通过在已填充的视图(已经有一个集合)上添加另一个项目来操作视图-ted 适配器),所以这次你需要告诉视图,嘿,我在你身上添加了一个项目,现在刷新自己然后更新列表(即显示)。

    【讨论】:

    • 谢谢!但我有一个新问题,在上面刷新:)
    • @HungryMilk 嗨,看看更新的解释,如果它有助于接受它作为答案:)
    【解决方案3】:

    除了莉莉的回答,如果你自己写适配器,你必须显式调用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-21
      • 2015-01-07
      • 1970-01-01
      • 2019-06-09
      • 2011-07-05
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多