自定义 ListView 中的滚动滞后

Posted

技术标签:

【中文标题】自定义 ListView 中的滚动滞后【英文标题】:scroll lag in Custom ListView 【发布时间】:2021-07-17 22:15:28 【问题描述】:

我的项目是一本学费管理书,我通过使用自定义 listView 在 Activity 中列出所有学生及其照片、姓名、ID、课程,它运行良好,但是当添加更多学生时,它在 listview 滚动中显示滞后。使用下面的适配器,我在 listView 中面临滚动滞后。我减小了存储在 SQLite 数据库中的图像的大小(小于 500kb),但它仍然不能顺利运行。 **

适配器代码

public class MyListAdapter extends BaseAdapter 
   private Context context;
   private int layout;
   private ArrayList<slmodel> recordlist;

    public MyListAdapter(Activity context, int layout, ArrayList<slmodel> recordlist) 
        this.context = context;
        this.layout= layout;
        this.recordlist = recordlist;
    

    @Override
    public int getCount() 
        return recordlist.size();
    

    @Override
    public slmodel getItem(int position) 
        return recordlist.get(position);
    

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

    private class ViewHolder
        ImageView imageView;
        TextView name,id, sclass;
    

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
        View row=convertView;
        ViewHolder holder=new ViewHolder();

        if(row==null)
          
              LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
              row=inflater.inflate(layout,null);
              holder.name=row.findViewById(R.id.bname);
              holder.id=row.findViewById(R.id.sid);
              holder.sclass =row.findViewById(R.id.scourse);
              holder.imageView=row.findViewById(R.id.imageView);
              row.setTag(holder);
          
        else
            holder=(ViewHolder)row.getTag();
        

        slmodel model=recordlist.get(position);
        holder.name.setText(model.getName());
        holder.id.setText(model.getId().toString());
        holder.sclass.setText(model.getsclass());

        byte[] recordimgae=model.getImgae();
        Bitmap bitmap= BitmapFactory.decodeByteArray(recordimgae,0,recordimgae.length);
        holder.imageView.setImageBitmap(bitmap);
        return row;
    

【问题讨论】:

【参考方案1】:

欢迎来到 SO,并祝贺您发布您的第一个问题。

使用图像加载库,例如 Picasso 或 Glide

使用这些库,您可以:

调整图片大小 使用缓存来减少加载时间 自动处理后台线程以加载和转换位图。

Glide 示例:

Glide.with(context)
                    .load(recordImage)
                    .asBitmap()
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .into(holder.imageView);

【讨论】:

showing error at .asBitmap() //Cannot resolve method 'asBitmap' in 'RequestBuilder' 感谢兄弟现在的工作......对于位图它写成-> Glide.with(context) .asBitmap().load(recordImage) .diskCacheStrategy(DiskCacheStrategy.ALL) .into (holder.imageView); @mihirSharma 很好,更重要的是,尝试用RecyclerView 替换您的ListView。它提高了长列表的性能。 @MihirSharma 如果您选择答案作为已接受的答案或支持它,那您会很好

以上是关于自定义 ListView 中的滚动滞后的主要内容,如果未能解决你的问题,请参考以下文章

滚动时Listview滞后,添加项目时崩溃

滚动自定义 ListView 时,复选框值发生变化

滚动时 ListView 自定义适配器错误

WPF:ListView自定义scrollviewer导致列标题消失

带有自定义滚动条的 QML Listview

自定义listview android中的textview不稳定