9

在執行readContacts()方法之前contactsList爲空,換句話說,執行contactsView.setAdapter(adapter)時,contactsList爲空,爲什麼此代碼仍然可以正確顯示聯繫人信息?爲什麼我不需要使用Adapter.notifyDataSetChanged()?

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無法刷新?

回答

0

問題是,你是在一個訂單輸入數據,即當你在列表中推入一個項目時,它會一路下降,你沒有在第4個,第5個輸入任何隨機索引,所以你沒有要調用notifyDataSetChanged(),因爲它的定義本身表示:有些數據已更改,或者任何反映數據集的視圖都應該自行刷新,以使新數據可見於列表之間,因爲在這種情況下數據將超出範圍可見列表的數量,即列表中顯示的子數量,因此它(ListView)始終要求在listView中特定的最後顯示的索引值(項目)之後的下一個視圖。

希望我對你有點清楚......!

++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++ 回答完您在編輯問題後,搜索並在此方面有自己的想法和理解後:

在第一種情況下,VIEW沒有需要改變。 如果這一點很清楚,那麼就來看第二個。首先,您從數據庫中獲取數據,然後在列表中添加一個項目,然後在設置適配器後填充它。適配器沒有設置,直到整個方法執行完成List。!好。

但在秒方案要更改VIEW(幾乎一切是去Android)還是你通過添加在已經填充查看其他項目(已一組泰德適配器)操縱視圖,所以這次你需要告訴視圖,嘿,我已經添加了一個項目,現在刷新自己,然後更新列表(即顯示)。

+0

謝謝!但我有一個新的問題,在上面刷新:) – HungryMilk

+0

@HungryMilk嗨有一個更新的解釋看看,如果它可以幫助接受它作爲答案:) –

+0

抱歉,我忘了!謝謝 : ) – HungryMilk

1

該方法在Android框架內部調用。你不必明確地調用它。

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

+0

我的意思是當我設置適配器時,列表是空的。在我使用'readcontacts'後,列表變得不是空的,但是我沒有使用'notifydatachanged()'來刷新它。那麼爲什麼列表視圖仍然可以顯示信息? – HungryMilk

+0

@HungryMilk當列表內容改變時,Android框架會自動調用'notifyDataChanged()'。所以你不必自己打電話。 – Lilylakshi

+0

謝謝!但我有一個新的問題,在上面刷新:) – HungryMilk

0

除了莉莉的答案,如果你編寫自己的適配器,您必須顯式調用它。

相關問題