当我反复滚动ListView时,应用程序崩溃了。

3

我已经使用了列表视图并且有超过65000条记录,但是滚动不够快和流畅,而且如果我一遍又一遍地滚动它,应用程序会崩溃,没有任何错误或任何ANR对话框,有谁能帮我解决这个问题吗?

我正在使用SimpleCursorLoaderCursorAdapter,以下是我的代码:

   private static class DotCursorLoader extends SimpleCursorLoader {

    private DbHelper mHelper;
    private CharSequence filter;

    public DotCursorLoader(Context context, DbHelper helper,
            CharSequence filter) {
        super(context);
        mHelper = helper;
        this.filter = filter;
    }

    @Override
    public Cursor loadInBackground() {

        return mHelper.getCursor(filter);
    }

}

private class DotCursorAdapter extends CursorAdapter {

    private Context mContext;
    private Typeface font;

    public class ViewHolder {
        TextView txtEng, txtGuj;
    }

    // public DotCursorAdapter(Context context, Cursor c, int flags) {
    // super(context, c, flags);
    // mContext = context;
    // }

    public DotCursorAdapter(Context context, Cursor c,
            boolean autoRequery) {
        super(context, c, autoRequery);
        mContext = context;

    }

    @Override
    public void bindView(View view, Context context,
            android.database.Cursor cursor) {
        ViewHolder holder = (ViewHolder) view.getTag();
        if (LibConstants.isEnglishEnabled(mActivity)) {

            holder.txtEng.setTextColor(settings.getInt(
                    LibConstants.English_Pref_Color_Key,
                    Color.BLACK));
            // txtEng.setTypeface(Typeface.DEFAULT);
            holder.txtEng.setTextSize(Integer.parseInt(settings
                    .getString("TextSize", "20")));
            holder.txtEng.setText(LibConstants.getWord(cursor
                    .getString(1)));
            Utils.setEnglishFont(holder.txtEng, mActivity);

            holder.txtGuj.setTextColor(settings.getInt(
                    LibConstants.Mean_Pref_Color_Key,
                    getResources().getInteger(
                            R.color.blue)));

            holder.txtGuj.setTypeface(font);
            holder.txtGuj.setTextSize(Integer.parseInt(settings
                    .getString("TextSize", "20")));
            holder.txtGuj.setText(LibConstants.getWord(cursor
                    .getString(2)));

        } else {

            holder.txtEng.setTextColor(settings
                    .getInt(LibConstants.Mean_Pref_Color_Key,
                            getResources().getColor(
                                    R.color.blue)));
            holder.txtEng.setTypeface(font);
            holder.txtEng.setTextSize(Integer.parseInt(settings
                    .getString("TextSize", "20")));
            holder.txtEng.setText((cursor
                    .getString(2)));

            holder.txtGuj.setTextColor(settings.getInt(
                    LibConstants.English_Pref_Color_Key,
                    Color.BLACK));
            holder.txtGuj.setTypeface(Typeface.DEFAULT);
            holder.txtGuj.setTextSize(Integer.parseInt(settings
                    .getString("TextSize", "20")));
            holder.txtGuj.setText(cursor
                    .getString(1));
            Utils.setEnglishFont(holder.txtGuj, mActivity);
        }

    }

    @Override
    public View newView(Context context,
            android.database.Cursor cursor, ViewGroup parent) {
        View view = LayoutInflater.from(mContext).inflate(
                R.layout.list_item, parent, false);
        ViewHolder viewHolder = new ViewHolder();
        viewHolder.txtEng = (TextView) view
                .findViewById(R.id.txtEng);
        viewHolder.txtGuj = (TextView) view
                .findViewById(R.id.txtGuj);
        view.setTag(viewHolder);
        return view;
    }

}

2
你能展示一下logcat的输出吗?如果应用程序崩溃了,肯定会有一些错误信息。 - dragi
@helleye,没有任何错误产生,也没有抛出任何异常,只是应用程序消失了 :( - Siddhpura Amit
但是至少应该有一些东西指出应用程序(活动)已被销毁。 - dragi
@helleye 如果我慢慢地滚动,一遍又一遍地重复,它就不会崩溃,但是如果快速滚动,它就会崩溃。 - Siddhpura Amit
1
可能是由于内存不足。增加应用程序的内存可能会解决您的问题,或者使用分页而不是一次加载65000个项目。 - Zar E Ahmer
显示剩余2条评论
3个回答

1

尝试这个。在滚动时,您需要回收视图。
注意:我没有测试过,可能会起作用...

View con=null; 
 class ViewHolder
     {

         TextView tv,tv1;
         public ViewHolder(View v) {
            // TODO Auto-generated constructor stub

                tv=(TextView)v.findViewById(R.id.phone_number); 
                tv1=(TextView)v.findViewById(R.id.contact_name);


        }
     }
     //
      @Override
    public View newView(Context context,
            android.database.Cursor cursor, ViewGroup parent) {
            ViewHolder viewHolder ;
            if(con==null)
            {
        View view = LayoutInflater.from(mContext).inflate(
                R.layout.list_item, parent, false);
                con=view;
        viewHolder = new ViewHolder(con);

        view.setTag(viewHolder);
         Log.i("getview","new view created");
        }

        return view;
    }

1

0
我会使用一个“加载更多”按钮来实现这个功能,比如说在25条记录之后,每次listview会加载另外的25条记录。 这里的示例是该实现方式中最好的之一。
你也可以使用GitHub上可用的下拉刷新API。

我不会考虑使用“加载更多按钮”,而是采用“无限适配器”自动加载更多的方式。 - Mdlc
当滑动到列表视图底部时,可以加载下一组25个结果。 - Michele La Ferla
如果这个答案对您有帮助,能否请您接受并点赞呢? - Michele La Ferla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接