Android Gridview上下快速滚动会让视图变得混乱

时间:2014-09-06 21:58:11

标签: android gridview scroll

我通过扩展baseadapter为GridView构建了一个自定义适配器。一切正常 - 除非你快速向上滚动,然后向下滚动,然后向上滚动,然后向下滚动通过gridview它最终会弄乱屏幕(第一个图标不对齐,然后滚动时一切都消失了)。这是我的适配器的代码 - 我使用了viewholder方法,这应该是最好的方法 - 但它仍然拒绝工作。我理解gridview中存在一些行回收问题 - 如何解决这个问题,无论用户上下滚动多少次,网格都保持良好状态,所有图标都按正确的顺序排列? / p>

非常感谢。

已修改以显示问题的屏幕截图

第一个屏幕截图显示了第一次向下滚动时的样子(gridview中有11行,显示底行)。第二个屏幕截图显示了滚动到顶部然后向下返回到底部的次数 - 它开始变得不对齐。第三个屏幕截图显示了当您从混乱的底部对齐方向向上滚动到顶部时会发生什么 - 它会越过顶行并以完全黑色的屏幕结束(此时唯一的出路是按下'返回& #39)。

gridview中显示的数据是自定义对象列表 - 每个对象包含设备上特定类型的每个Intent的元素ImageView和TextView。

public class CSGridAdapter extends BaseAdapter
{
private final List<CS> csList;
private final Context context;

public CSGridAdapter(Context context, List<CS> csList) {
    super();
    this.csList=csList;
    this.context=context;
}

@Override
public int getCount() {
    return csList.size();
}

@Override
public Object getItem(int position) {
    return position;
}

@Override
public long getItemId(int position) {
    return position;
}

private class ViewHolder {
    ImageView icon;
    TextView label;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    final ViewHolder holder;

    if (convertView == null) {
        holder  = new ViewHolder();

        final LayoutInflater mInflater = LayoutInflater.from(context);
        convertView=   mInflater.inflate(R.layout.cs_grid_item, parent, false);

        holder.icon = (ImageView) convertView.findViewById(R.id.cs_icon);
        holder.label= (TextView)     convertView.findViewById(R.id.cs_label);

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.icon.setTag(convertView);
    holder.label.setTag(convertView);

    CS cs=csList.get(position);

    if (cs!=null) {
        holder.icon.setImageBitmap(cs.getBitmap());
        holder.label.setText(cs.getLabel());
    }

    return convertView;
}

}

已修改为在gridview中添加单个项目的布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:paddingBottom="30dp"
android:gravity="bottom|center_horizontal"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<ImageView
    android:id="@+id/cs_icon"
    android:layout_width="wrap_content"
    android:layout_height="50dp"
    />

<TextView
    android:paddingTop="10dp"
    android:id="@+id/cs_label"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="bottom|center_horizontal"
    />

</LinearLayout>

已编辑,以显示grid xx在主xml

中的外观
  <GridView
    android:paddingTop="20dp"
    android:id="@+id/gridCS"
    android:numColumns="3"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/black"
    android:overScrollMode="never"
    />
编辑

以显示我如何将适配器添加到主要活动类中的gridview

 CSGridAdapter csGridAdapter = new     CSGridAdapter(this.getApplicationContext(),csListToUse);
    gridView.setAdapter(csGridAdapter);

View looks ok on startup

On scroll down - view Begins to be messed up

On scroll up - scrolls past top row and shows only black

4 个答案:

答案 0 :(得分:0)

该问题的解决方案是将ImageView / TextView转换为单个TextView,顶部带有compounddrawable。通过使每个元素相同(textview中的行数,复合可绘制的大小等),可以根据需要滚动,而不会弄乱视图。

答案 1 :(得分:0)

通过阅读问题我理解的是当滚动非常快的图像没有被加载并且你得到口吃(卡住)这是因为你正在通过Bitmap加载图像,这是很少的负载,所以当你滚动真的很快它将花时间加载图片。

解决方案而不是使用位图直接加载图像使用一个名为Picasso的超棒库它只是超级快我知道你真的很喜欢这个你可以这样做

  1. 将picasso jar文件添加到您的项目(Download picasso jar file here
  2. 使用picasso加载像这样的图像

    Picasso.with(context).load(new File(title)).centerCrop()
                .resize(150, 150).error(R.drawable.ic_launcher).into(image);  
    
  3. 其中title是您要加载的图像路径。裁剪,调整大小,错误是可选的。

答案 2 :(得分:0)

我通过每次重画来解决它。当我打电话给getview(..

我忽略了这种情况:  如果(convertView == null) if(true)

我想这会使代码运行缓慢,并使用更多内存。

答案 3 :(得分:0)

遇到相同的问题,通过将android:maxLines="1"添加到TextView

来解决