【问题标题】:App crashes when I scroll the ListView again and again当我一次又一次滚动 ListView 时应用程序崩溃
【发布时间】:2014-08-04 09:49:25
【问题描述】:

我使用了列表视图,有超过 65,000 条记录,滚动不是快速流畅,如果我一次又一次滚动它,应用程序崩溃,没有任何错误或任何 ANR 对话框,谁能帮忙我来解决这个问题?

我正在使用SimpleCursorLoader 和CursorAdapter,下面是我的代码:

   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;
    }

}

【问题讨论】:

  • 你能显示logcat的输出吗?如果应用程序崩溃了,一定有一些错误
  • @helleye 不,没有任何错误正在生成,也没有任何异常抛出只是应用程序消失了:(
  • 但是至少应该指出应用程序(活动)被破坏了
  • @helleye 如果我慢慢滚动它,一次又一次这么多次,它不会崩溃,但在更快滚动时它会崩溃
  • 可能是内存不足。增加应用程序的内存可能会解决您的问题或使用分页而不是一次加载 65000 个项目。

标签: android listview simplecursoradapter android-cursoradapter android-cursorloader


【解决方案1】:

可以在此处找到 Endless Adapter 的最佳示例之一

https://github.com/commonsguy/cwac-endless

【讨论】:

    【解决方案2】:

    试试这个。在滚动时你必须回收视图
    注意:我没有测试过,它可能会工作......

    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;
        }
    

    【讨论】:

      【解决方案3】:

      我会在假设 25 条记录之后使用加载更多按钮来执行此操作,并且每次列表视图都会加载另外 25 条记录。 here 示例是此类实现的最佳示例之一。

      您也可以使用滑动来刷新 GitHub 上的可用 API。

      【讨论】:

      • 我不会考虑“加载更多按钮”,而是像“无尽”适配器那样自动加载更多。
      • 到达列表视图底部时可以加载下一组 25 个结果。
      • 如果对您有帮助,请您接受并投票赞成这个答案吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 2012-08-16
      相关资源
      最近更新 更多