ListViews с несколькими макетами элементов - PullRequest
13 голосов
/ 05 августа 2010

У меня есть 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 Ответ

4 голосов
/ 01 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...