@timurkin

Почему дублируется элемент в listview?

Есть адаптер CardsAdapter:
public class CardsAdapter extends ArrayAdapter<CardView>{
    private String server_ip;
    public ArrayList<CardView> data;
    Context mContext;
    public static final int TEXT_BLOCK = 0;
    public static final int TEXT_BLOCK_EXTENDED = 1;
    public static final int TEXT_BLOCK_EXTENDED_URL = 2;
    public static final int IMAGE_BLOCK = 3;
    public static final int IMAGE_BLOCK_URL = 4;
    public static final int VIDEO = 5;


    public CardsAdapter(Context context, ArrayList<CardView> objects, String _server_ip) {
        super(context, 0, objects);
        this.server_ip = _server_ip;
        this.data = objects;
        mContext = context;
    }

    public int getItemViewType(int position) {
        return getItem(position).getType();
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        int viewType = getItemViewType(position);
        CardView current = getItem(position);
        if( convertView == null){
            switch (viewType){
                case TEXT_BLOCK:
                    convertView = getConvertView(R.layout.card_text_block, parent);
                    ((TextView)convertView.findViewById(R.id.card_text_block_text)).setText(current.getString("text"));
                    ((TextView)convertView.findViewById(R.id.card_text_block_header)).setText(current.getString("header"));
                    break;
                case TEXT_BLOCK_EXTENDED:
                    convertView = getConvertView(R.layout.card_text_block_extended, parent);
                    ((TextView)convertView.findViewById(R.id.card_text_block_extended_text)).setText(current.getString("text"));
                    ((TextView)convertView.findViewById(R.id.card_text_block_extended_header)).setText(current.getString("header"));
                    String thumbnail_url = String.format("http://%s:9998/%s", server_ip, current.getString("thumbnail"));
                    new DownloadImageTask((ImageView)convertView.findViewById(R.id.card_text_block_extended_thumbnail)).execute(thumbnail_url);
                    Log.d("SUPER_TAG", thumbnail_url);
                    break;
            }
        }

        return convertView;

    }
    private View getConvertView(int layout_id, ViewGroup parent){
        return LayoutInflater.from(mContext).inflate(layout_id, null);
    }
}

Информация обновляется в фоне и добавляется карта с помощью .add(0, card), но почему-то всегда показывается самая первая добавленная инфа. Что не так?
  • Вопрос задан
  • 2644 просмотра
Решения вопроса 1
@Uran_90
У Вас есть условие: if( convertView == null), из-за элементы на экране заполняются только когда создаются в первый раз. ListView переиспользует строки, а не создаёт каждый раз заново, т.е. если в списке 50 строк, а на экране помещается 5, то будет создано 7 строк и при уходе с экрана они будут использоваться для других элементов. В этом случае getView вызовется, а convertView не будет null, а будет заполнено старыми данными.
Поэтому данные нужно записывать во view при каждом вызове getView.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@onepavel
Консультация и разработка мобильных приложений
вы не там используете объект current, вынесите его за пределы условия с инфлейтами и начните использовать ViewHolder
Ответ написан
Ваш ответ на вопрос

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

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