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

Posted

技术标签:

【中文标题】Listview滚动时滞后,添加项目时崩溃【英文标题】:Listview lag when scrolling, and crash when add item 【发布时间】:2018-06-08 05:02:40 【问题描述】:

我有一个自定义列表视图,带有一个添加更多元素的按钮 但是当我添加和元素时应用程序崩溃,但是当我重新启动时我发现添加了元素,(很少它不会崩溃)

还有我

我使用自定义适配器

 class CustomAdapter extends BaseAdapter 

    ArrayList<ListItem> listItems = new ArrayList<ListItem>();

    CustomAdapter(ArrayList<ListItem> list)
        this.listItems = list;
    

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

    @Override
    public Object getItem(int position) 
        return listItems.get(position).name;
    

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

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

        LayoutInflater inflater = getLayoutInflater();
        View view = inflater.inflate(R.layout.list_item,null);

        TextView name = (TextView) view.findViewById(R.id.name);
        TextView lastm = (TextView) view.findViewById(R.id.last);
        TextView time = (TextView) view.findViewById(R.id.time);
        CircleImageView pic= (CircleImageView) view.findViewById(R.id.pic);

        name.setText(listItems.get(i).name);
        lastm.setText(listItems.get(i).lastm);
        time.setText(listItems.get(i).time);
        Bitmap bmp = BitmapFactory.decodeByteArray(listItems.get(i).pic,0,listItems.get(i).pic.length);
        pic.setImageBitmap(bmp);




        return view;
    

当我添加一个元素时,应用程序崩溃

add.setOnClickListener(new View.OnClickListener() 
                @Override
                public void onClick(View v) 
                    EditText editText=(EditText) mView.findViewById(R.id.name);
                    String name=editText.getText().toString();
                    boolean result=myDataBase.insertData(imageViewToByte(img),name,"no messages yet","");
                    if (result) 
                        Toast.makeText(Main2Activity.this, "Saved in DATABASE", Toast.LENGTH_SHORT).show();
                        viewLastData();
                        dialog.dismiss();
                    

【问题讨论】:

"崩溃" ..;你有这种崩溃的堆栈跟踪吗? 你能添加你的xml代码吗? Stulktuske 我没听懂,“stacktrace?” 表示错误日志 我觉得你应该用 Picasso 来做图片,用 RecyclerView 来做列表。 【参考方案1】:

如果您的 ListView 滞后,那是因为您使用 wrap_content 作为 listView 的 layout_height。它会强制您的 ListView 计算其中的所有项目,并且会对性能产生巨大影响。

所以将wrap_content 替换为match_parent 以避免这些滞后。

编辑:在 Adapter 中也使用 ViewHolder 模式,请参阅 this link。

这是一个例子:

// ViewHolder Pattern
private static class ViewHolder 
    TextView name, status;


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

    if (convertView == null) 
        LayoutInflater vi = LayoutInflater.from(getContext());
        convertView = vi.inflate(R.layout.list_item, parent, false);

        holder = new ViewHolder();
        holder.name = (TextView) convertView.findViewById(R.id.text_name);
        holder.status = (TextView) convertView.findViewById(R.id.another_text);

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

    // Then do the other stuff with your item
    // to populate your listView
    // ...

    return convertView  

【讨论】:

我把它改成了 match_parent 但我还是有同样的问题

以上是关于Listview滚动时滞后,添加项目时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

RecyclerView 滚动时滞后

在滚动视图中动态隐藏状态栏时滞后/屏幕冻结(Swift 3)

ListView 更新后滚动到顶部

ListView 滚动 - 一个一个

在listview中向下滚动时如何加载更多项?

在顶部添加新项目时在 ListView 中保持滚动位置