일부 데이터를 목록보기에 올바르게 표시하기 위해 사용자 정의 어댑터를 구축했습니다. 에서 onContextItemSelected() 데이터 집합이 변경되고 을 호출하여 notifyDataSetChanged()을 호출하여 목록보기를 업데이트합니다. 외관상 어댑터의 getView() 메소드는의 onContextItemSelected() 이후에만 이 호출됩니다.getView()가 너무 늦게 호출되었습니다.
- 왜? contextItemSelected()에서
- 나는 방법 editLanguage() 이전의 getView ()으로 팽창하도록되어 버튼에 액세스해야 전화. getView()은 "너무 늦게"라고 불리며 NullpointerException이 발생합니다.
버튼은 "notifyDataSetChanged"에 의해 호출되어야하는 "getView"에서 비정상적으로 실행됩니다.
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;
//...
버튼 (bu_language_change)에 액세스하려고하면 null이됩니다.
private void editLanguage(final LanguageItem languageToEdit) {
Button editButtonConfirm = (Button) this.findViewById(R.id.bu_language_change); // null
감사합니다. 첫 번째 솔루션이 저에게 효과적입니다. 실제로 나는이 해킹이 유일한 좋은 해결책이라고 상상할 수 없다. 세 가지 완전히 다른 행 유형이 있다고 가정합니다. 모든보기를 하나의 .xml 파일로 구현하고 가시성을 변경하는 것은보기 흉한 일입니다. 게다가 어댑터에서 editLanguage를 호출하면 SoD 원리가 침해됩니다. 어떤 제안? – null