2010-08-05 2 views
13

У меня есть ListView на моем ListActivity, и я хотел бы, чтобы строки ListView были 1 из 3 разных макетов. Первый элемент в моем списке всегда будет использовать макет A, второй элемент в моем списке всегда будет использовать макет B, а все последующие элементы будут использовать макет C.ListViews с несколькими макетами позиций

Вот моя функция getView:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // get the View for this list item 
    View v = convertView; 
    if (v == null) { 
     LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     switch (position) { 
      case 0: 
       v = vi.inflate(R.layout.layout_A, parent, false); 
       break; 
      case 1: 
       v = vi.inflate(R.layout.layout_B, parent, false); 
       break; 
      default: 
       v = vi.inflate(R.layout.layout_C, parent, false); 
       break; 
     } 
    } 
    switch (position) { 
     case 0: 
      TextView txtLabel1 = (TextView)findViewById(R.id.label1); 
      TextView txtLabel2 = (TextView)findViewById(R.id.label2); 
      if (txtLabel1 != null) { 
       txtLabel1.setText("sdfasd"); 
      } 
      if (txtLabel2 != null) { 
       txtLabel2.setText("dasgfadsasd"); 
      } 
      break; 
     default: 
      break; 
    } 
    // return the created view 
    return v; 
} 

R.id.label1 и R.id.label2 являются TextViews на R.layout.layout_A. Тем не менее, txtLabel1 и txtLabel2 имеют значение null после попытки их установки. Зачем?

Я прошел через этот код в отладчике и завысил правильный макет (R.layout.layout_A) и упал в правильный регистр ниже, чтобы установить R.id.label1 и R.id.label2 текст.

Кроме того, если есть лучший способ сделать это, пожалуйста, дайте мне знать.

+0

Проверьте [этот учебник] (http://android.amberfog.com/?p=296). Они объясняют нечто подобное тому, чего вы пытаетесь достичь. – Macarse

ответ

4

Похож: «Просмотреть v = convertView; if (v == null) {..." является проблемой. Вы должны повторно создавать представление каждый раз, потому что вы не знаете тип данного представления. Кроме того, для более эффективной реализации вы можете использовать подход аудитории. Вы можете найти некоторые идеи в этом блоге: http://codinglines.frankiv.me/post/18486197303/android-multiple-layouts-in-dynamically-loading

+0

Это ОЧЕНЬ плохая идея и значительно замедлит ход. Macarse postet - хороший пример, который в любом случае попытается повторно использовать представления. – Chris

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