1) Если необходимо какое-то нестандартное поведение элементов в ListView, то лучше создать свой адаптер, унаследовав от BaseAdapter
2) Если нужны строки различного формата, то обратить внимание на метод getItemViewType(int position)
у адаптера
Поподробнее:
Учитывая ваше уточнение, можно предположить, что у вас 3 типа строк по количеству элементов. Делаем красиво.
1) Объявим enum с типами, к примеру:
public enum RowType {
Type1,
Type2,
Type3
};
2) Объявим базовый интерфейс для работы со строками:
public interface Row {
public View getView(View convertView);
public int getViewType();
}
3) Далее для каждого типа создаём класс, реализующий интерфейс. Я покажу на примере 1 типа:
public class Type1Row implements Row {
private final LayoutInflater inflater;
private final Context context;
private String text;
private String img1Url;
private String img2Url;
private String img3Url;
public Type1Row(Context context, LayoutInflater inflater, String text, String img1Url, String img2Url, String img3Url){
this.inflater = inflater;
this.context = context;
this.text = text;
this.img1Url = img1Url;
this.img2Url = img2Url;
this.img3Url = img3Url;
}
public View getView(View convertView) {
ViewHolder holder;
View view;
if (convertView == null) {
ViewGroup itemView = (ViewGroup)inflater.inflate(R.layout.list_iten_type_1, null);
holder = new ViewHolder((TextView) itemView.findViewById(R.id.text),
(ImageView) itemView.findViewById(R.id.img1),(ImageView) itemView.findViewById(R.id.img2),(ImageView) itemView.findViewById(R.id.img3));
itemView.setTag(holder);
view = itemView;
} else {
holder = (ViewHolder)convertView.getTag();
view = convertView;
}
holder.txt.setText(text);
// на основе this.img1Url, this.img2Url, this.img3Url
holder.img1.setBackground(...);
holder.img2.setBackground(...);
holder.img3.setBackground(...);
return view;
}
public int getViewType() {
return RowType.Type1.ordinal();
}
private static class ViewHolder {
final TextView txt;
final TextView img1;
final TextView img2;
final TextView img3;
private ViewHolder(TextView txt, TextView img1, TextView img2, TextView img3) {
this.txtSearch = txtSearch;
this.img1 = img1;
this.img2 = img2;
this.img3 = img3;
}
}
}
По аналогии для 2-х других типов. Остаётся только адаптера написать:
public class MyListAdapter extends BaseAdapter {
private List<Row> mRows;
private final Context context;
public MyListAdapter(Context context, List<MyObject> list) {
this.context = context;
mRows = new ArrayList<Row>();
// тут уже строки добавляете как захотите
// к примеру, все элементы будут типа Type1
for(MyObject obj: list)
mRows.add(new Type1Row(this.context, (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE),
obj.text, obj.img1Url, obj.img2Url, obj.img3Url);
}
@Override public void notifyDataSetChanged() {
super.notifyDataSetChanged();
}
@Override
public int getViewTypeCount() {
return RowType.values().length;
}
@Override
public int getItemViewType(int position) {
return mRows.get(position).getViewType();
}
public int getCount() {
return mRows.size();
}
public Object getItem(int position) {
return mRows.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
return mRows.get(position).getView(convertView);
}
}
MyObject
ваш класс какой-то, который содержит данные для отображения.