访问ListView中的EditText

时间:2016-01-19 16:38:49

标签: android listview android-adapter

我有一个ListView,其中包含一个包含EditText的自定义适配器。我希望能够访问此EditText并设置文本。我正在使用此代码访问EditText

    firstName = (EditText)  details.getChildAt(0).findViewById(R.id.editText);
    lastName = (EditText) details.getChildAt(1).findViewById(R.id.editText);
    work = (EditText) details.getChildAt(2).findViewById(R.id.editText);
    mobile = (EditText) details.getChildAt(3).findViewById(R.id.editText);
    home = (EditText) details.getChildAt(4).findViewById(R.id.editText);
    relation = (EditText) details.getChildAt(5).findViewById(R.id.editText);
    primarySwitch = (Switch) details.getChildAt(6).findViewById(R.id.primaryContactSwitch);

当我尝试使用按钮访问它们时,它按预期工作。在onCreate方法上访问它们时,它会崩溃:

Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference

它几乎就像我在创建之前访问ListView一样。以下是onCreate

中的完整代码
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_emergency_contact_details);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    wireUpControls();
    checkForExistingId();
}

private void  wireUpControls(){
    emergencyArray = getResources().getStringArray(R.array.emergency);
    details = (ListView) findViewById(android.R.id.list);

    EmergencyContactAdapter adapter = new EmergencyContactAdapter(emergencyArray, this);
    details.setAdapter(adapter);

    firstName = (EditText)  details.getChildAt(0).findViewById(R.id.editText);
    lastName = (EditText) details.getChildAt(1).findViewById(R.id.editText);
    work = (EditText) details.getChildAt(2).findViewById(R.id.editText);
    mobile = (EditText) details.getChildAt(3).findViewById(R.id.editText);
    home = (EditText) details.getChildAt(4).findViewById(R.id.editText);
    relation = (EditText) details.getChildAt(5).findViewById(R.id.editText);
    primarySwitch = (Switch) details.getChildAt(6).findViewById(R.id.primaryContactSwitch);
}

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

ListView会在您滚动浏览时创建视图。您试图尽早访问它们以至于尚未创建视图,因此它们返回null。您应该尝试找到将findViewById逻辑放入ListView适配器的方法。

但是,我怀疑你甚至不应该使用ListView。如果您有静态内容(在本例中为7 EditText),则您更可能需要ScrollView。你试图接近这个的方式让我觉得ListView不适合这项工作。 (这也可以通过将常量数组传递到ListView的适配器中来证明 - ListViews用于动态数据)。

答案 1 :(得分:0)

您可以在适配器中访问getView方法中的EditText,如:

T

现在,您只能在editText对象上方设置文本。