我构建了一个自定义适配器,以便在列表视图中正确显示某些数据。在 onContextItemSelected ()中,数据集已更改,我调用 notifyDataSetChanged ()来更新列表视图。显然,适配器的 getView ()方法仅在 onContextItemSelected ()终止后才被调用。
按钮在" getView"中充气。应该由" notifyDataSetChanged"。
调用public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
languageItem selectedLanguage = languages.get((int) info.id);
switch (item.getItemId()) {
case EDIT:
languages.get((int) info.id).setSelected(true);
adapter.update(languages);
adapter.notifyDataSetChanged(); // call getView() of the adapter!
editLanguage(selectedLanguage); // access a button that was inflated by getView()
//...
public View getView(int position, View convertView, ViewGroup parent) {
//...
switch(getItemViewType(position)) {
case DEFAULT_LINE:
//...
break;
case EDIT_LINE:
convertView = LayoutInflater.from(getContext()).inflate(R.layout.language_row_edit, null); // contains button bu_language_change
viewHolder.button = (Button) convertView.findViewById(R.id.bu_language_change);
break;
//...
尝试访问按钮时,我得到null(bu_language_change)。
private void editLanguage(final LanguageItem languageToEdit) {
Button editButtonConfirm = (Button) this.findViewById(R.id.bu_language_change); // null
答案 0 :(得分:0)
notifyDataSetChanged不会强制适配器立即调用getView方法的序列。它宁愿告诉它应该刷新并且它是异步发生的。如果你想实现这个目标,你提到我有两个想法:
bu_language_change Button
添加到DEFAULT_LINE
的观看级别为View.GONE
的视图中,然后在EDIT_LINE
中更改可见性View.VISIBLE
。 View.GONE
使您的布局表现得没有这样的孩子(bu_language_change按钮)。editLanguage
方法。但这是一个坏主意。 Romain Guy
in here说:...不保证getView()完全被调用 每个项目一次...
或者从editLanguage
方法的主体调用此getView
方法,这样就可以解决您的问题。
我建议您观看有关ListView的Google I / O. It's over here