2017-02-14 12 views
-1

У меня есть CustomGrid для каталога продукции. Данные для Grid хранятся локально. Текст поступает из локального файла JSON, и изображения также хранятся под res.Android - Gridview ведет себя сумасшедшим

При отображении GridView 300 элементов расположены неправильно. Они повторяются после 20 записей, и они смешиваются, когда я просматриваю вверх и вниз.

Я отлаживал массивы данных, но они выглядят отлично. У меня также есть тот же путь для каждого элемента прямо сейчас. Поэтому каждый элемент Gridview имеет одинаковое изображение. Но это не отличается от поведения GridView.

У меня нет проблем на других Gridviews с гораздо меньшим количеством предметов. Я читал о ленивой загрузке, но я не загружаю файлы с изображениями

Почему эта сетка ведет себя так? Слишком много перегрузки? Как я могу решить эту проблему?

EDIT:

CustomGrid:

public class CustomGrid extends BaseAdapter{ 
private Context mContext; 
private final String[] gridItemText; 
private final int[] imageID; 

public CustomGrid(Context c, String[] gridItemText, int[] imageID){ 
    mContext = c; 
    this.gridItemText = gridItemText; 
    this.imageID = imageID; 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return gridItemText.length; 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    View grid; 
    LayoutInflater inflater = (LayoutInflater) mContext 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    if (convertView == null) { 

     //grid = new View(mContext); 
     grid = inflater.inflate(R.layout.grid_single_main, null); 
     TextView textView = (TextView) grid.findViewById(R.id.grid_single_text); 
     ImageView imageView = (ImageView)grid.findViewById(R.id.grid_single_image); 
     textView.setText(gridItemText[position]); 
     imageView.setImageResource(imageID[position]); 
    } else { 
     grid = (View) convertView; 
    } 

    return grid; 
} 

} 

активность:

CustomGrid adapter = new CustomGrid(ProductCatalogActivity.this, menuData, imagePath); 
    gridView1=(GridView)findViewById(R.id.grid_Main); 
    gridView1.setAdapter(adapter); 
    gridView1.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 
      //ToDo 
    } 
}); 
+3

Не могли бы вы добавить код – raktale

+0

Я добавил соответствующий код – Mike

ответ

1

Попробуйте это вместо вашего механизма Viewholder

TextView textView; 
    ImageView imageView; 

    if (convertView == null) { 

     //grid = new View(mContext); 
     convertView = inflater.inflate(R.layout.grid_single_main, null); 
     textView = (TextView) convertView.findViewById(R.id.grid_single_text); 
     imageView = (ImageView) convertView.findViewById(R.id.grid_single_image); 
     convertView.setTag(new ViewHolder(textView, imageView)); 
    } else { 

     ViewHolder viewHolder = (ViewHolder) convertView.getTag(); 
     textView = viewHolder.textView; 
     imageView = viewHolder.imageView; 

    } 

    textView.setText(gridItemText[position]); 
    imageView.setImageResource(imageID[position]); 
return convertView; 

также использовать этот viewholder

private static class ViewHolder { 

     public final TextView textView; 
     public final ImageView imageView; 

     public ViewHolder(TextView textView, ImageView imageView) { 
      this.textView = textView; 
      this.imageView = imageView; 
     } 
    } 
+0

Спасибо. Это сработало. Но почему? – Mike

+0

Ну, я предполагаю, что владелец вида, который вы использовали, неправильно обрабатывал объекты, например, не было механизма сохранения привязки объекта, такого как setTag() или эквивалент, поэтому из-за этого из-за этого может меняться состояние объектов. – raktale