@TimkaTV

Как правильно использовать ViewHolder + LisView?

Добрый день,
Использовал паттерн ViewHolder :
public View getView(int position, View convertView, ViewGroup parent) {
        switch (type) {
            case 0: return item_view_new(data, position, convertView, parent);
            case 1: return item_view_new(data, position, convertView, parent);
            case 2: return item_view_new(data, position, convertView, parent);
            case 3: return item_view_video(data, position);
            case 4: return item_view_video(data, position);
            case 5: return item_view_video(data, position);
            case 6: return item_view_meeting(data, position);
            case 10: return item_view_new_error(data, position);
            case 99: return item_view_new(data, position, convertView, parent);
        }
        return null;
    }



    public View item_view_new(ArrayList<HashMap<Integer, Object>> data, int position,final View convertView, View parent) {
        View v = convertView;
        ViewHolder viewHolder;
        if (v == null) {
            viewHolder = new ViewHolder();

            v = LayoutInflater.from(context).inflate(R.layout.new_layout_item, (ViewGroup) parent, false);

            viewHolder.text_group = (TextView) v.findViewById(R.id.group);
            viewHolder.text_date = (TextView) v.findViewById(R.id.date);
            viewHolder.title = (TextView) v.findViewById(R.id.title);
            viewHolder.text = (TextView) v.findViewById(R.id.content);
            viewHolder.author = (TextView) v.findViewById(R.id.author);
            viewHolder.addition = (TextView) v.findViewById(R.id.addition);
            viewHolder.img = (ImageView) v.findViewById(R.id.image);
            viewHolder.ico_group = (ImageView) v.findViewById(R.id.ico_group);

            viewHolder.text_group.setTypeface(Typeface.createFromAsset
                    (context.getAssets(), "Ubuntu-M.ttf"));
            viewHolder.text_date.setTypeface(Typeface.createFromAsset
                    (context.getAssets(), "Ubuntu-N.ttf"));
            viewHolder.title.setTypeface(Typeface.createFromAsset
                    (context.getAssets(), "Ubuntu-M.ttf"));
            viewHolder.text.setTypeface(Typeface.createFromAsset
                    (context.getAssets(), "Ubuntu-L.ttf"));
            viewHolder.author.setTypeface(Typeface.createFromAsset
                    (context.getAssets(), "Ubuntu-N.ttf"));
            viewHolder.addition.setTypeface(Typeface.createFromAsset
                    (context.getAssets(), "Ubuntu-N.ttf"));
            viewHolder.text.setTextSize(Integer.parseInt(sharedPref.getString("size_preview", "15")));
            viewHolder.pos = position;
            v.setTag(viewHolder);

        } else {
            viewHolder = (ViewHolder) v.getTag();

        }

        viewHolder.text_group.setText(themetext(data.get(position).get(NAMEGROUP).toString()));
        viewHolder.text_date.setText(data.get(position).get(DATE).toString());
        viewHolder.title.setText(data.get(position).get(HEADER).toString());
        viewHolder.text.setText(ExtraClass.text_clear(data.get(position).get(CONTENT).toString()));
        viewHolder.author.setText(data.get(position).get(AUTHOR).toString());
        ExtraClass.setIco(data.get(position).get(NAMEGROUP).toString(), viewHolder.ico_group, context);
        return v;
    }


class ViewHolder {
    static TextView text_group;
    static TextView text_date;
    static TextView title;
    static TextView text;
    static TextView author;
    static TextView addition;
    static ImageView img;
    static ImageView ico_group;
    static int pos;
}


Прокрутка действительно плавная, но загружаются только 3-4 записи, а потом начинают дублироваться (причем если поиграться со сколлом, то иногда отрисовывет верные записи) Может кто-то делал подобные ошибки? Спасибо
  • Вопрос задан
  • 754 просмотра
Решения вопроса 1
Ewintory
@Ewintory
Java / Android developer
v = LayoutInflater.from(context).inflate(R.layout.new_layout_item, (ViewGroup) parent, false);
- тут не нужно parentкастовать в ViewGroup

Проблема тут:
class ViewHolder {
    static TextView text_group;
    static TextView text_date;
    static TextView title;
    static TextView text;
    static TextView author;
    static TextView addition;
    static ImageView img;
    static ImageView ico_group;
    static int pos;
}

Все поля статические, а значит их значения общие для всех вьюхолдеров. Как можно было такую ошибку допустить?
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы