Android 在某些情况下崩溃

Android is crashing in certain situation

我正在开发 android 应用程序。我想通过自制 class ( entryClass ) 显示数据。列表由 recyclerLayout 表示,其中包括诸如此类的 cardView 列表。

这个(Lorem Ipsum ...)的描述将是 200 个字符 + 到最后一个单词的末尾(例如,如果第 200 个字符正好在单词的中间,其余部分将被打印)到为此,我做了一个新方法:

    public static String cutText(String text){
    String temp="";
    StringBuilder build=new StringBuilder(temp);
    int i=0;
    while((i>200 || text.charAt(i)!=' ') && i<text.length())
    {
        if(text.charAt(i)!='\n'){
        build.append(text.charAt(i));}
        else {build.append(text.charAt(' '));}
        i++;
    }
    return build.toString();
}

但是当我使用此方法时,应用程序在 运行 时崩溃。 这是添加此方法的部分:

public void onBindViewHolder(final ViewHolder holder, int position) {
    //creating an cardView
        holder.mItem = mValues.get(position);
        holder.mAuthorView.setText(mValues.get(position).author);
        holder.mDateView.setText(mValues.get(position).date);
        holder.mContentView.setText(cutText(mValues.get(position).content));
        holder.mImageView.setImageResource(R.drawable.sadness);

当带有 cutText 方法的行更改为不包含它时,一切正常。

我希望我包含了所有重要的内容。 最好的祝福! 编辑: 崩溃日志:

12-21 15:24:05.062 10574-10574/pl.spicyproject.quickstart E/AndroidRuntime: FATAL EXCEPTION: main
                                                                        Process: pl.spicyproject.quickstart, PID: 10574
                                                                        java.lang.StringIndexOutOfBoundsException: length=3; index=3
                                                                            at java.lang.String.charAt(Native Method)
                                                                            at pl.spicyproject.quickstart.Home.cutText(Home.java:201)
                                                                            at pl.spicyproject.quickstart.Home$SimpleItemRecyclerViewAdapter.onBindViewHolder(Home.java:151)
                                                                            at pl.spicyproject.quickstart.Home$SimpleItemRecyclerViewAdapter.onBindViewHolder(Home.java:129)
                                                                            at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5217)
                                                                            at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5250)
                                                                            at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4487)
                                                                            at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4363)
                                                                            at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1961)
                                                                            at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1370)
                                                                            at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1333)
                                                                            at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:562)
                                                                            at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2900)
                                                                            at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3071)
                                                                            at android.view.View.layout(View.java:16630)
                                                                            at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                                            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
                                                                            at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
                                                                            at android.view.View.layout(View.java:16630)
                                                                            at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                                            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
                                                                            at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1732)
                                                                            at android.widget.LinearLayout.onLayout(LinearLayout.java:1497)
                                                                            at android.view.View.layout(View.java:16630)
                                                                            at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                                            at android.support.design.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1037)
                                                                            at android.support.design.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:747)
                                                                            at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
                                                                            at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1156)
                                                                            at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:760)
                                                                            at android.view.View.layout(View.java:16630)
                                                                            at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                                            at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1043)
                                                                            at android.view.View.layout(View.java:16630)
                                                                            at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                                            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
                                                                            at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
                                                                            at android.view.View.layout(View.java:16630)
                                                                            at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                                            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
                                                                            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
                                                                            at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
                                                                            at android.view.View.layout(View.java:16630)
                                                                            at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                                            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
                                                                            at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
                                                                            at android.view.View.layout(View.java:16630)
                                                                            at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                                            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
                                                                            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
                                                                            at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
                                                                            at android.view.View.layout(View.java:16630)
                                                                            at android.view.ViewGroup.layout(ViewGroup.java:5437)
                                                                            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
                                                                            at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
                                                                            at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2678)
                                                                            at android.view.View.layout(View.jav

12-21 15:24:07.450 10574-10574/pl.spicyproject.quickstart I/Process:发送信号。 PID:10574 SIG:9

您需要先在 while 循环条件中检查字符串长度:

while(i<text.length() && (i>200 || text.charAt(i)!=' '))

因为否则它可能会尝试调用 text.charAt(i) 以获得超出字符串末尾的 i

还有:

build.append(text.charAt(' '));

这仅在 text 中至少有 33 个字符时有效,因为 text.charAt(' ') 在语义上等同于 text.charAt(32)

不清楚您到底想做什么,但看起来您正在尝试用空格替换换行符。以下可能更容易:

text.replace('\n', ' ')

对于您的规范,我认为如果您使用类似以下的内容会更清楚,这样可以避免使用 StringBuilder:

String cutText(String text) {
  int i = Math.min(200, text.length());
  while (i < text.length() && text.charAt(i) != ' ') {
    ++i;
  }
  return text.substring(0, i).replace('\n', ' ');
}