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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了滚动时Listview滞后,添加项目时崩溃相关的知识,希望对你有一定的参考价值。

我有一个自定义列表视图,其中包含一个按钮,可以添加更多元素,但是当我添加并元素化应用程序崩溃时,但是当我重新启动时,我发现该元素已添加,(很少不会崩溃)

和我

我使用自定义适配器

 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();
                    }
答案

如果你的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  
}

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

自定义 ListView 中的滚动滞后

向上/向下滚动时ListView滞后

滚动时,Android Studio自定义ListView与图像滞后

颤动的重型平台代码导致UI滞后

滚动时 CollectionView 滞后

第一次进入片段ListView时AsyncTask更新progressBar的进度失败,滚动ListView后就ok了