2016-04-12 3 views
0

Мне нужно использовать ArrayAdapter для заполнения ListView в приложении для Android. Для того, чтобы use the ArrayAdapter, он говоритКак использовать массив объектов с Android ArrayAdapter?

Например, если у вас есть массив строк, которые вы хотите отобразить в ListView, инициализировать новый ArrayAdapter с помощью конструктора, чтобы указать расположение для каждой строки и массива строк:

ArrayAdapter adapter = новый ArrayAdapter (это, android.R.layout.simple_list_item_1, myStringArray);

Аргументы для этого конструктора являются:

  • Ваше приложение Контекст
  • макет, который содержит TextView для каждой строки в массиве
  • Строка массива

Тогда просто позвоните setAdapter() в вашем ListView:

ListView listView = (ListView) findViewB Yid (R.id.listview); listView.setAdapter (адаптер);

Однако у меня нет массива строк, у меня есть массив объектов, содержащих строковые значения.

public class Headers { 
    private String from; 
    private String to; 
    private String subject; 

    public Headers (String from, String to, String subject){ 
     this.from = from; 
     this.to = to; 
     this.subject = subject; 
    } 

    public String getFrom() { return from; } 
    public void setFrom(String from) { this.from = from; } 

    public String getTo() { return to; } 
    public void setTo(String to) { this.to = to; } 

    public String getSubject() { return subject; } 
    public void setSubject(String subject) { this.subject = subject; } 
} 

В моем макете есть TextView, соответствующий значениям в моем объекте.

Вот мой макет с моей ListView:

<LinearLayout android:orientation="vertical"> 
    <ListView android:id="@+id/listOfHeaders" > 
</LinearLayout> 

А вот макет для каждой строки в ListView быть заселена ArrayAdapter:

<LinearLayout android:orientation="horizontal"> 
    <TextView android:id="@+id/toTextView" /> 
    <TextView android:id="@+id/fromTextView" /> 
    <TextView android:id="@+id/subjectTextView" /> 
</LinearLayout> 
+0

поэтому используйте '' ArrayAdapter , а не '' ArrayAdapter pskink

+0

Да, но тогда мне нужно заполнить мои TextViews со строками из объекта заголовков, и это выглядит как ListView хочет массив строк. – Brian

+1

На самом деле, вы не можете переопределить метод getView и выполнить все сопоставления (проще, если вы используете «ArrayAdapter (контекст контекста, int resource, int textViewResourceId)» ctor) – pskink

ответ

6

Использование ArrayAdapter недостаточно, вам нужно будет расширить ArrayAdapter и создать пользовательский адаптер, чтобы вы могли перезаписать создание строк, чтобы использовать макет списка. Пожалуйста, проверьте этот пример:

public class CustomAdapter extends ArrayAdapter<Headers> { 

    Context context; 
    int layoutResourceId; 
    ArrayList<Headers> data = null; 

    public CustomAdapter(Context context, int resource, List<Headers> objects) { 
     super(context, resource, objects); 
     this.layoutResourceId = resource; 
     this.context = context; 
     this.data = (ArrayList) objects; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     HeaderHolder holder = null; 

     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new HeaderHolder(); 
      holder.from = (TextView) row.findViewById(R.id.fromTextView); 
      holder.to = (TextView)row.findViewById(R.id.toTextView); 
      holder.subject = (TextView)row.findViewById(R.id.subjectTextView); 

      row.setTag(holder); 
     } 
     else 
     { 
      holder = (HeaderHolder) row.getTag(); 
     } 

     Headers item = data.get(position); 
     holder.from.setText(item.getFrom()); 
     holder.to.setText(item.getTo()); 
     holder.subject.setText(item.getSubject()); 

     return row; 
    } 

    private class HeaderHolder { 
     public TextView from; 
     public TextView to; 
     public TextView subject; 

    } 
} 

для деятельности на OnCreate метод:

ListView list = (ListView) findViewById(R.id.listView); 
ArrayList<Headers> data = new ArrayList<Headers>(); 
data.add(new Headers("from", "to", "subject")); 

ArrayAdapter adapter = new CustomAdapter(this, R.layout.list, data); 
list.setAdapter(adapter); 

Вы можете видеть, что CustomAdapter использует HeaderHolder как часть рисунка ViewHolder поэтому управление списком является эффективным.

+0

Это работает фантастично, спасибо! Однако есть одна проблема. Иногда я получаю IndexOutOfBoundsException в строке «Headers item = data.get (position)». Не всегда, но время от времени. Я использую Fragments как вкладки, и я получаю это, когда я переключаюсь с фрагмента на свой список. – Brian

+0

Рад, что это помогло. Для исключения добавьте блок if для проверки позиции перед тем, как использовать, или приложите эти последние строки в файле try..catch. Это странная проблема, но без кода фрагментов я не уверен, что вызывает ее. Используйте одно из двух предложений, чтобы избежать исключения, пока вы находите фактическую причину. Удачи с проектом. –

+0

В итоге я сделал несколько изменений, чтобы избавиться от ошибки. Я изменил список объектов объектам [] и использовал объекты заголовка thisHeader = (Header) [position], и это, похоже, исправило это. Спасибо еще раз за помощь. – Brian

0

Для вашего рода информации, вы можете это сделать, переопределив метод getView(). В основном вы должны предоставить настраиваемый макет для своего элемента ListView и что вам нужно раздуть метод getView(). Для получения дополнительной информации вы можете ссылаться на этот: http://www.ezzylearning.com/tutorial/customizing-android-listview-items-with-custom-arrayadapter