ListViews с несколькими макетами элементов

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

Вот моя функция 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 являются нулевыми после их установки. Зачем?

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

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

Ответы

Ответ 1

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