2015-06-07 5 views
3

В настоящее время я разрабатываю приложение для создания контента для Android. Основная цель - дать пользователю возможность генерировать список из текстовых и графических записей (представленных в конце с помощью EditText и ImageView).Custom ArrayAdapter messing up views, с NullPointerException

Я подключил этот список до ListView путем написания пользовательского ArrayAdapter во время использования ViewHolder Pattern

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    // get current Entry 
    Entry e = getItem(position); 
    // variable for holding the view 
    ViewHolder holder; 

    // check if there is no view created 
    if (convertView == null) { 
     // prepare holder for view to be saved in 
     holder = new ViewHolder(); 

     // get layout inflater 
     LayoutInflater inflater = (LayoutInflater) super.getContext() 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     // if current entry is an image entry 
     if (e.getType().equals(Entry.Type.IMAGE_ENTRY)) { 
      // inflate layout with ImageView 
      convertView = inflater.inflate(R.layout.image_list_item, 
        parent, false); 
      ImageView iView = (ImageView) convertView 
        .findViewById(R.id.imageDisplay); 

      // save inflated view in holder 
      holder.imageViewItem = iView; 

      // store the holder with the view 
      convertView.setTag(holder); 

      // if it is a text entry 
     } else if (e.getType().equals(Entry.Type.TEXT_ENTRY)) { 
      // inflate layout with EditText 
      convertView = inflater.inflate(R.layout.text_list_item, parent, 
        false); 
      EditText tView = (EditText) convertView 
        .findViewById(R.id.textField); 

      // save inflated view in holder 
      holder.editTextItem = tView; 

      // store the holder with the view 
      convertView.setTag(holder); 

     } 
    } else { 
     // get holder from existing view 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    if (e != null) { 
     if (e.getType().equals(Entry.Type.IMAGE_ENTRY)) { 
      // load corresponding image 
      holder.imageViewItem.setImageBitmap(((ImageEntry) e).getImage()); 
     } else if (e.getType().equals(Entry.Type.TEXT_ENTRY)) { 
      // load corresponding text 
      holder.editTextItem.setText(((TextEntry) e).getText()); 
     } 
    } 
    return convertView; 
} 

Вопреки учебники и примеры я видел мне нужно различать между раскладками я раздувают из-за разница между текстом и изображениями. И это, кажется, вызывает некоторые проблемы, потому что иногда после добавления различных записей за другой я получаю эти исключения

E/AndroidRuntime(15812): java.lang.NullPointerException: Attempt to  invoke virtual method 'void android.widget.EditText.setText(java.lang.CharSequence)' on a null object reference 
E/AndroidRuntime(15812): at <project>.util.EntryListAdapter.getView(EntryListAdapter.java:104) 

Так что, мне кажется, что этот метод вызывается на неверном зрения, потому что в противном случае должен быть объект типа «EditText». Я не совсем уверен, когда ListView запускает все свои представления, и я экспериментирую с моим адаптером и перечисляю много, но я не могу понять, почему это иногда забивает вызовы моих записей. Может ли кто-нибудь мне помочь?

ответ

2

если вы не отменяют getViewTypeCount, вы получите только один нуль convertView, так что вы будете инициализировать его с image_list_item.xml или text_list_item.xml. Если вы хотите обрабатывать различный типы просмотров переопределения

public int getViewTypeCount() { 
     return 2; 
} 

для обработки двух различных типов зрения и getItemViewType

public int getItemViewType (int position) { 
    Entry e = getItem(position); 
    if (e.getType().equals(Entry.Type.IMAGE_ENTRY)) { 
     return 0; 
    } 
    return 1; 
} 

и getView проверки для возвращаемого значения getItemViewType

+0

Спасибо, кажется, работает и имеет гораздо больше смысла в отношении того, что адаптер должен знать о моих взглядах. Я реализовал его так, и до сих пор он отлично работает. Я также рассмотрю вид ресайклера, упомянутый @ prats110892, поскольку он, похоже, лучше подходит моим потребностям. – nilo

+0

приветствуются – Blackbelt

1

Шаблон ViewHolder для ListView должен использоваться, когда вы знаете типы вида позиций перед рукой. Если они будут динамически меняться при добавлении новых позиций (по сути, если вызывается notifyDataSetChanged()), тогда возникают проблемы с переработкой.

Для динамического изменения коллекций с различными типами взглядов, то лучше использовать RecyclerView

+0

Благодарим Вас за рекомендация! Я отметил ответ @ Blackbelt как правильный, потому что он решил конкретную проблему здесь. Я собираюсь попробовать RecyclerView в любом случае, потому что он, кажется, лучше подходит здесь. Я не могу дать вам взнос, хотя, потому что я только что зарегистрировался:/ – nilo

+0

Нет проблем! Ура! – prats110892