2015-12-21 155 views
-1

我正在開發一個android應用程序。我想通過自制類(entryClass)顯示數據。列表由recyclerLayout表示,其中包括如此的cardView列表。 enter image description hereAndroid在某些情況下崩潰

對此的描述(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法線更改爲不包含它,一切工作正常。

我希望我包括一切重要的東西。 此致敬禮! 編輯: LOG FROM CRASH:

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 /過程:發送信號。 PID:10574 SIG:9

+0

請包括髮生崩潰時的logcat。 –

+0

http://pastebin.com/UY41yzuF – Unlucky

+1

你覺得'text.charAt('')'是什麼意思? (我認爲這意味着'text.charAt(32)')。 –

回答

2

您需要首先檢查字符串長度while循環條件:

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

,因爲否則可能嘗試調用text.charAt(i)i超過字符串的結尾。

另外:

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

這是否有至少33個字符是text只會工作,因爲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', ' '); 
} 
+0

我做了這個改變。應用程序仍然崩潰。 – Unlucky

+0

完全一樣嗎? –

+0

public static String cutText(String text){ text = text.replace('\ n',''); String temp =「」; StringBuilder build = new StringBuilder(temp); int i = 0; (i 200 || text.charAt(i)!='')) { build.append(text.charAt(i)); i ++; } return build。的toString(); } – Unlucky