【问题标题】:GridView scroll not smoothGridView 滚动不流畅
【发布时间】:2017-01-23 18:04:28
【问题描述】:

我在我的应用程序中使用 Gridview 来显示 SD 卡上文件夹中的图像... 我的问题是 GridView 中的滚动,它不如 Gallery App 流畅。 这是适配器代码 -

public class GridViewAdapter extends BaseAdapter {

    // Declare variables
    private Activity activity;
    private String[] filepath;
    private String[] filename;

    private static LayoutInflater inflater = null;

    public GridViewAdapter(Activity a, String[] fpath, String[] fname) {
        activity = a;
        filepath = fpath;
        filename = fname;
        inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }

    public int getCount() {
        return filepath.length;

    }

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

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

    public View getView(int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        if (convertView == null)

            vi = inflater.inflate(R.layout.gridview_item, null);

        // Locate the ImageView in gridview_item.xml
        ImageView img = (ImageView) vi.findViewById(R.id.image);


        // Set file name to the TextView followed by the position
        TextView txt = (TextView) vi.findViewById(R.id.name);

        // Decode the filepath with BitmapFactory followed by the position
        Bitmap bmp = BitmapFactory.decodeFile(filepath[position]);

        // Set the decoded bitmap into ImageView
        img.setImageBitmap(bmp);
       txt.setText(filename[position]);
        return vi;
    }
}

如何解决这个问题,让滚动流畅?

【问题讨论】:

  • 你应该使用 ViewHolder

标签: android android-gridview


【解决方案1】:

您需要在单独的线程中执行BitmapFactory.decodeFile,如本教程: https://developer.android.com/training/displaying-bitmaps/process-bitmap.html

我建议您使用缓存,不要在每次用户滚动时重新加载图像: https://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

【讨论】:

    【解决方案2】:

    你可以这样做。

    1. 实现了异步图片加载,让每张图片都异步加载
    2. 使用第三方 ImageLoaders 并以缩略图大小加载图像。 For.ex UniversalImageLoader。查看this更多详情
    3. 您可以使用RecyclerViewGridLayoutManager 而不是GridView,这是更优化的控制。例如:http://www.android-examples.com/android-recyclerview-with-gridview-gridlayoutmanager/

    其他参考:http://www.technotalkative.com/android-select-multiple-photos-from-gallery/

    【讨论】:

      【解决方案3】:

      BitmapFactory.decodeFile 是一次又一次在 ui 线程上执行的繁重操作。你已经使用了一些缓存库。

      您可以使用一些图像加载库,例如 Universal image loaderGlidepicasso

      请使用支架试一试。

      class Holder{
      ImageView img ;
      TextView txt;
      }
      
      
      public View getView(int position, View convertView, ViewGroup parent) {      
          Holder holder;
          if (convertView == null)
       {
           convertView = inflater.inflate(R.layout.gridview_item, null);
             holder=new Holder();
      
          holder.img = (ImageView) convertView.findViewById(R.id.image);
      
         holder.txt = (TextView) convertView.findViewById(R.id.name);
      
           convertView.setTag(holder)
          }
        else
      {
        holder=(Holder)convertView.getTag();
       }
      
      
         Picasso.with(activity) .load(filepath[position]) .into(holder.img);
         txt.setText(filename[position]);
          return convertView;
      }
      

      【讨论】:

      • 我使用了毕加索,但它不显示图像..我的图像视图是空白的.. Picasso.with(activity) .load(filepath[position]) .into(img);
      • 在我编辑答案时尝试以某种方式实现这一点。
      • 您可以选择使用滑翔或毕加索。但为了更好的结果毕加索是好的。
      • Picasso 无法加载图像...完全空白...那么它与 Glide 相比如何? :)
      • 我不能说毕加索没有显示滑翔显示的图像会有什么问题。但无论如何,毕加索都很好。无论如何,我认为您的问题可以使用 glide 解决,因此您可以使用 glide。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      • 2018-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多