Баг ли это? SimpleAdapter

Рейтинг: -1Ответов: 2Опубликовано: 03.02.2015

Вот код http://pastebin.com/vBdzsQ0U

Суть такова. Создаю ListVIew, прикрепляю SimpleAdapter. Всего 4 переменные: Text, Video, Mic, Star.

Мне надо сделать так, чтобы Mic создавался только в 1, 3 и 7 строке, в остальных сделать так, чтобы его вообще не было. Почему вообще небыло? Чтобы video встал на 15dp от Star, а то получается, он становиться где-то на 45dp от Star, так как он думает, что Mic находится справа от него.

Как быть? Как вы в таком случае решаете эту проблему или решали. Если непонятно, нарисую.

Ответы

▲ 4Принят

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 ваш класс какой-то, который содержит данные для отображения.

▲ 2

Пишите свой адаптер и делайте в нем все, что хочется!