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

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

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

Solutions Collecting From Web of "ListViews с несколькими макетами элементов"

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