ImageAdapter для GridView повторяет текстовые просмотры в конце сетки [duplicate]

Когда вы используете operator [], std :: map ищет элемент с заданным ключом. Если он не найден, он создает его. Следовательно, проблема с const.

Используйте метод find, и все будет в порядке.

Можете ли вы отправить код о том, как вы пытаетесь использовать find ()? Правильный путь:

  if (map.find (name)! = Map.end ()) {// ...}  
17
задан Samir Mangroliya 28 June 2012 в 14:32
поделиться

4 ответа

Обычно вы видите те же элементы, что и прокрутка вниз по GridView, потому что в методе getView вы устанавливаете drawables для ImageView только тогда, когда convertView является null (например, для первые элементы, которые видны, когда на экране появляются GridView). Если convertView не null, то есть у вас есть переработанный вид строки, вы не устанавливаете правильное изображение, и вы остаетесь с изображением, которое ранее было установлено на этом переработанном представлении. Попробуйте изменить метод getView следующим образом:

public View getView(int position, View convertView, ViewGroup parent) {
    View v;
    if (convertView == null) {  // if it's not recycled, initialize some attributes
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(     Context.LAYOUT_INFLATER_SERVICE );
        v = inflater.inflate(R.layout.gridview_item_layout, parent, false);
    } else {
        v = (View) convertView;
    }
    TextView text = (TextView)v.findViewById(R.id.grid_item_text);
    text.setText(mTextIds[position]);
    ImageView image = (ImageView)v.findViewById(R.id.grid_item_image);
    image.setImageDrawable(mThumbIds[position]);
    return v;
}

При нажатии элемента отображаются правильные элементы, потому что вы используете параметр position для извлечения данных.

82
ответ дан Luksprog 15 August 2018 в 21:15
поделиться
  • 1
    Это сработало! Хотя LogCat продолжает показывать эти строки GC_EXTERNAL_ALLOC, когда я сначала прокручиваю сетку ... – Lucas Jota 28 June 2012 в 14:50
  • 2
    @LucasJota Это сборщик мусора, я думаю, что это нормально (если он не делает GridView лагги). Имейте в виду, что вы запрашиваете эти изображения, а также сохраняете их в памяти (я не знаю, сколько у вас есть). – Luksprog 28 June 2012 в 14:58
  • 3
    Работала отлично для меня с Button + Textview – KNU 3 March 2014 в 18:50
  • 4
    Спасибо вам большое! – Will Jamieson 4 August 2014 в 23:21
  • 5
    Работал и для меня, большое спасибо! – Ljubisa Livac 15 September 2014 в 10:04

Это мой код для GridView с Button + Textview

public View getView(final int position, View convertView, ViewGroup parent) {
        LayoutInflater mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.grid_item, null);  
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        TextView text = (TextView)convertView.findViewById(R.id.texto_grid);
        text.setText(app_listaActiva_NOMBRES[position]);
        Button image = (Button)convertView.findViewById(R.id.miniatura_grid);
        image.setBackgroundResource(R.drawable.custom_button);
        image.setOnClickListener(new MyOnClickListener2(position,app_listaActiva_SONIDOS));
        return convertView;
    }
2
ответ дан KNU 15 August 2018 в 21:15
поделиться

Отправить и gridview или listview, а в конструкторе реализовать этот метод реализовать onscroll listener

    this.mGridView = mGridView;
    this.mGridView.setOnScrollListener(new OnScrollListener() {

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            Log.v("onScrollStateChanged", "onScrollStateChanged");
            if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
                isScrollStop = true;

                notifyDataSetChanged();
            } else {
                isScrollStop = false;
            }
        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
            Log.v("onScroll", "onScroll");
        }
    });
0
ответ дан Krste Moskov 15 August 2018 в 21:15
поделиться

Измените здесь и повторите попытку,

   View v;
if (convertView == null) {  // if it's not recycled, initialize some attributes
    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(     Context.LAYOUT_INFLATER_SERVICE );
    v = inflater.inflate(R.layout.gridview_item_layout, null);
    TextView text = (TextView)v.findViewById(R.id.grid_item_text);
    text.setText(mTextIds[position]);


} else {

    v = (View) convertView;
}
if(view!=null)
        {
               ImageView image = (ImageView)v.findViewById(R.id.grid_item_image);
               image.setImageDrawable(mThumbIds[position]);
               notifyDataSetChanged();  //Calling this helped to solve the problem. 
        }


return v;
}
0
ответ дан osayilgan 15 August 2018 в 21:15
поделиться
  • 1
    Зачем вам добавить дополнительную проверку, а мы уже проверили для convertview == null, я бы поставил последний блок в блок else. – Gripsoft 16 July 2012 в 18:26
  • 2
    да, вы правы, но это не работает в "else statement" для меня как-то, я не уверен. – osayilgan 17 July 2012 в 07:38
Другие вопросы по тегам:

Похожие вопросы: