【问题标题】:Android: Gridview going blank while scrolling fastAndroid:快速滚动时 Gridview 变为空白
【发布时间】:2012-12-27 10:15:27
【问题描述】:

如果我快速滚动,Android 中的 GridView 将变为空白

请给我一个解决方案..

提前谢谢..

这是我的代码

gridView.setAdapter(new ImageAdapter(ChangedDashboard.this, stringarray));

这是我在 gridview 上设置的适配器类

public class ImageAdapter extends BaseAdapter {
private Context context;
private final String[] menuvalues;

public ImageAdapter(Context context, String[] menuValues) {
    this.context = context;
    this.menuvalues = menuValues;
}
public View getView(int position, View convertView, ViewGroup parent) {

    LayoutInflater inflater = (LayoutInflater) context
    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View gridView;

    if (convertView == null) {

        gridView = new View(context);

        // get layout from mobile.xml
        gridView = inflater.inflate(R.layout.changedashboard, null);

    } else {
        gridView = (View) convertView;
    }

    TextView textView = (TextView) gridView
    .findViewById(R.id.textView1);
    textView.setText(menuvalues[position]);

    // set image based on selected text
    ImageView imageView = (ImageView) gridView
    .findViewById(R.id.imageView1);

    String mobile = menuvalues[position];

    if (mobile.equals("1")) {
        imageView.setImageResource(R.drawable.new1);
    } else if (mobile.equals("2")) {
        imageView.setImageResource(R.drawable.new2);
    } else if (mobile.equals("3")) {
        imageView.setImageResource(R.drawable.new3);
    }else if (mobile.equals("4")) {
        imageView.setImageResource(R.drawable.new4);
    } else if (mobile.equals("5")) {
        imageView.setImageResource(R.drawable.new5);
    }else if (mobile.equals("6")) {
        imageView.setImageResource(R.drawable.new6);
    } 

    return gridView;
}

public int getCount() {
    return menuvalues.length;
}

public Object getItem(int position) {
    return null;
}

public long getItemId(int position) {
    return 0;
}

}

请给我解决办法

更新代码

public class ImageAdapter extends BaseAdapter {
private Context context;
private final String[] menuvalues;

public ImageAdapter(Context context, String[] menuValues) {
    this.context = context;
    this.menuvalues = menuValues;
}
public View getView(int position, View convertView, ViewGroup parent) {

    LayoutInflater inflater = (LayoutInflater) context
    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View gridView;

    if (convertView == null) {

        gridView = new View(context);

        // get layout from mobile.xml
        gridView = inflater.inflate(R.layout.changedashboard, null);
        ViewHolder holder = new ViewHolder();
        holder.textView = (TextView) gridView
                .findViewById(R.id.textView1);
        holder.imageView = (ImageView) gridView
                .findViewById(R.id.imageView1);
        gridView.setTag(holder);

    } else {
        gridView = (View) convertView;
    }

    /*TextView textView = (TextView) gridView
    .findViewById(R.id.textView1);*/


    // set image based on selected text
    /*ImageView imageView = (ImageView) gridView
    .findViewById(R.id.imageView1);*/

    String mobile = menuvalues[position];

    ViewHolder holder = (ViewHolder)gridView.getTag();
    holder.textView.setText(mobile);
    if (mobile.equals("1")) {
        holder.imageView.setImageResource(R.drawable.new1);
    } else if (mobile.equals("2")) {
        holder.imageView.setImageResource(R.drawable.new2);
    } else if (mobile.equals("3")) {
        holder.imageView.setImageResource(R.drawable.new3);
    }else if (mobile.equals("4")) {
        holder.imageView.setImageResource(R.drawable.new4);
    } else if (mobile.equals("5")) {
        holder.imageView.setImageResource(R.drawable.new5);
    }

    return gridView;
}

public int getCount() {
    return menuvalues.length;
}

public Object getItem(int position) {
    return null;
}

public long getItemId(int position) {
    return 0;
}
public static class ViewHolder {
    TextView textView;
    ImageView imageView;
}

}

【问题讨论】:

  • 最好贴代码,方便用户给出准确答案
  • 你用 android:cacheColorHint="#00000000" 试试看
  • 把上面的属性放到你的 GridView 中然后看看。
  • 我已经试过了……但没用……谢谢回复

标签: android android-layout android-gridview


【解决方案1】:

用户ViewHolder 重用视图的方法。因为,每次滚动时,您都会按 id 查找视图,这需要一些处理,并且可能会导致非常小的延迟,从而导致 GridView 闪烁。

这里有一些有用的链接来了解 ViewHolder。

  1. why does the ViewHolder pattren work?
  2. ViewHolder pattern: caching effectively
  3. Commonsware:AdapterViews and Adapters 具体参见 ViewHolder 部分。

【讨论】:

  • 什么不起作用?你有什么尝试,在你的问题中发布你更新的代码。
【解决方案2】:

我面临同样的问题 可能是 TextView 的高度有问题。因此,使 TextView 单行如下:

android:singleLine="true" 或者,如果您希望某些项目有 2 或 3 行,则使所有项目都有 2 或 3 行,例如:

android:minLines="2"

参考:GridView breaks while scrolling

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多