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