2016-06-19 1 views
0

Я вижу много SO сообщений о полезности использования convertView в адаптерами, как this one, this one или this one (и многие другие ...)Должен ли я использовать convertView в моем ArrayAdapter, если я не раздуваю?

У меня есть ArrayAdapter, но я создаю вид с нуля, простой горизонтальный LinearLayout, в котором я добавляю несколько текстовых просмотров. Количество текстовых просмотров и их вес зависит от позиции в списке. В первой строке может быть 3 телевизора, 7 во втором и 25 в третьем, причем каждый из них имеет разный вес, в зависимости от базы данных.

В этом случае, поскольку я не могу надуть что-нибудь, что делает convertView?

Должен ли я использовать его? Если да, как я могу?

EDIT: Вот мой код:

@Override 
public View getView(final int position, View convertView, ViewGroup parent){ 
    LinearLayout layout = new LinearLayout(context); 
    for (int i = 0; i < totalTVNumber; i++) { 
     LifeEvent event = getEventFromDB(cost, position); 
     if (event != null) { 
      TextView eventTV = event.getTextView(getContext()); 
      eventTV.setLayoutParams(new LinearLayout.LayoutParams(0, 100, weight));//0 en width sinon weight n'est pas pris en compte !! 
      layout.addView(eventTV); 
     } 
    } 
} 
+0

бы не вы будете надувать эту точку зрения, что вы создаете с нуля? –

+0

nope, количество и вес телевизоров зависят от базы данных и от позиции в списке –

+0

Почему в вашем коде нет инструкции возврата? Это ошибка компиляции? –

ответ

0

ArrayAdapter автоматически делает рециркуляцию представления для вас. Следовательно, вам не нужно обращаться с самим собой в случае адаптера Array. Пожалуйста, обратитесь к приведенному ниже коду, который я вытащил из ArrayAdapter.java. Вы можете получить ясность от этого.

public View getView(int position, View convertView, ViewGroup parent) { 
     return createViewFromResource(mInflater, position, convertView, parent, mResource); 
    } 

    private View createViewFromResource(LayoutInflater inflater, int position, View convertView, 
      ViewGroup parent, int resource) { 
     View view; 
     TextView text; 

     if (convertView == null) { 
      view = inflater.inflate(resource, parent, false); 
     } else { 
      view = convertView; 
     } 

     try { 
      if (mFieldId == 0) { 
       // If no custom field is assigned, assume the whole resource is a TextView 
       text = (TextView) view; 
      } else { 
       // Otherwise, find the TextView field within the layout 
       text = (TextView) view.findViewById(mFieldId); 
      } 
     } catch (ClassCastException e) { 
      Log.e("ArrayAdapter", "You must supply a resource ID for a TextView"); 
      throw new IllegalStateException(
        "ArrayAdapter requires the resource ID to be a TextView", e); 
     } 

     T item = getItem(position); 
     if (item instanceof CharSequence) { 
      text.setText((CharSequence)item); 
     } else { 
      text.setText(item.toString()); 
     } 

     return view; 
    } 
+0

Я боюсь, что я до сих пор очень много начинаю, чтобы полностью понять Android-код ... –

2

Что делает convertView содержит?

Он содержит прошлое View, которое вы создали с нуля, которое прокручивается с экрана и имеет право на переработку.

Должен ли я использовать его?

Да, пожалуйста.

Если да, то как я мог?

Так же, как и все остальные. Тот факт, что вы создаете свои взгляды напрямую, а не через инфляцию, не имеет значения.

Таким образом, вы можете сделать что-то вроде этого:

class YourAdapter extends ArrayAdapter<Whatever> { 
    @Override 
    public View getView(int position, View convertView, 
          ViewGroup parent) { 
     if (convertView==null) { 
     convertView=newView(parent); 
     } 

     bindView(position, convertView); 

     return(convertView); 
    } 

    private View newView(ViewGroup parent) { 
     // create and return your new View 
    } 

    private void bindView(int position, View row) { 
     // populate the widgets of your new or recycled view 
    } 
    } 
+0

ОК, поэтому convertview содержит linearlayout с текстовыми изображениями. Использование convertView похоже на получение макета, удаление текстовых просмотров и добавление других, как это стоит? (или, может быть, я ничего не получил: s) –

+0

@DanChaltiel: «Использование convertView - это получение макета, удаление текстовых просмотров и добавление других» - нет. Вы извлекаете «TextViews» и вызываете 'setText()' на них, чтобы заменить их существующий текст тем, что вы хотите, чтобы новый текст был. В моем скелете кода в ответе вы сделаете эту работу в 'bindView()', независимо от того, произошла ли «строка» от инфляции, переработки или что-то новое. Если вы хотите упростить доступ к виджетам «TextView», не стесняйтесь использовать [шаблон держателя вида] (https://developer.android.com/training/improving-layouts/smooth-scrolling.html#ViewHolder). – CommonsWare

+0

Мой плохой, я не добавил достаточно подробностей, но, как я сказал @Farbod, количество и вес моих текстовых просмотров зависят от позиции в списке. Если бы это было похоже на то, что я понимаю на вашем посту, было бы лучше раздуться из XML, нет? Я добавил код, если вы хотите проверить –

Смежные вопросы