java.lang.StackOverflowError: stack size 8MB while Enabling/Disabling TextView#setTextIsSelectable in ListView Adapter
Solution 1
Finally I got the solution for my problem. I removed ViewHolder
pattern in MyAdapter
like
private static class MyAdapter extends BaseAdapter {
private static final String TAG = "HistoryAdapter";
private final LayoutInflater inflater;
private int mSelectedPosition = -1;
private String[] mItems;
public MyAdapter(Context context, String[] mItems) {
this.mItems = mItems;
inflater = LayoutInflater.from(context);
}
public void setSelectedPosition(int mSelectedPosition) {
this.mSelectedPosition = mSelectedPosition;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
convertView = inflater.inflate(R.layout.selectable_text_layout, null, false);
TextView selectableTV = (TextView) convertView.findViewById(R.id.selectableTextView);
selectableTV.setText(getItem(position));
if (position == mSelectedPosition) {
Log.d(TAG, "getView() called with: " + "position = [" + position + "], selected = " + true);
selectableTV.setTextIsSelectable(true);
selectableTV.setSingleLine(false);
selectableTV.setEllipsize(null);
} else {
Log.d(TAG, "getView() called with: " + "position = [" + position + "], selected = " + false);
selectableTV.setTextIsSelectable(false);
selectableTV.setSingleLine(true);
selectableTV.setEllipsize(TextUtils.TruncateAt.END);
}
return convertView;
}
@Override
public String getItem(int position) {
return mItems[position];
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public int getCount() {
return mItems.length;
}
}
But still didn't find the the reason for the problem when using ViewHolder
pattern.If anybody find the reason let me know.
Solution 2
i was calling onBackPressed()
recursively and that caused StackOverFlowError
for me.
shobhan
Enthusiast android application developer. Like programming any time. Skills : Android and Core Java Want to learn : Android Game development cell : 08500080420 e-mail : [email protected] you can reach me : @facebook/shobanbabu
Updated on July 16, 2022Comments
-
shobhan almost 2 years
I have an activity with
ListView
. Displaying theTextView
in each list item. Switching the properties of selected position using these methodsEditText#setTextIsSelectable
,EditText#setEllipsize
&EditText#setSingleLine
. clicking on 1st item is working good. But while clicking on another item I'm gettingStackOverFlowError
.Below is my code sample. Please let me know if i do any mistake.
import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; public class SelectableTextListActivity extends Activity { private static final String TAG = "HistoryActivity"; private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);//only ListView present in this layout listView = (ListView) findViewById(R.id.myList); String items[] = {"Some Information Some Information Some Information", "Some Information Some Information Some Information", "Some Information Some Information Some Information", "Some Information Some Information Some Information", "Some Information Some Information Some Information", "Some Information Some Information Some Information", "Some Information Some Information Some Information", "Some Information Some Information Some Information"}; final MyAdapter myAdapter = new MyAdapter(this, items); listView.setAdapter(myAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Log.d(TAG, "onItemClick: position=" + position); myAdapter.setSelectedPosition(position); myAdapter.notifyDataSetChanged(); } }); } private static class MyAdapter extends BaseAdapter { private static final String TAG = "HistoryAdapter"; private final LayoutInflater inflater; private int mSelectedPosition = -1; private String[] mItems; public MyAdapter(Context context, String[] items) { mItems = items; inflater = LayoutInflater.from(context); } public void setSelectedPosition(int mSelectedPosition) { this.mSelectedPosition = mSelectedPosition; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { convertView = inflater.inflate(R.layout.selectable_text_layout, null, false); viewHolder = new ViewHolder(convertView); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } String item = getItem(position); viewHolder.selectableTV.setText(item); if (position == mSelectedPosition) { Log.d(TAG, "getView() called with: " + "position = [" + position + "], selected = " + true); viewHolder.selectableTV.setTextIsSelectable(true); viewHolder.selectableTV.setSingleLine(false); viewHolder.selectableTV.setEllipsize(null); } else { Log.d(TAG, "getView() called with: " + "position = [" + position + "], selected = " + false); viewHolder.selectableTV.setTextIsSelectable(false); viewHolder.selectableTV.setSingleLine(true); viewHolder.selectableTV.setEllipsize(TextUtils.TruncateAt.END); } return convertView; } @Override public String getItem(int position) { return mItems[position]; } @Override public long getItemId(int position) { return 0; } @Override public int getCount() { return mItems.length; } private class ViewHolder { public final TextView selectableTV; ViewHolder(View convertView) { selectableTV = (TextView) convertView.findViewById(R.id.selectableTextView); } } } }
Layout file : selectable_text_layout.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:focusable="false" android:focusableInTouchMode="false" android:orientation="vertical" android:padding="5dp"> <TextView android:id="@+id/selectableTextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:clickable="true" android:ellipsize="end" android:focusable="false" android:text="My app name" android:textAppearance="?android:textAppearanceMedium" /> </LinearLayout>
And the stack trace is
D/Error: ERR: stack=java.lang.StackOverflowError: stack size 8MB at java.lang.Class.isInstance(Class.java:1484) at android.text.SpannableStringInternal.getSpans(SpannableStringInternal.java:217) at android.text.SpannedString.getSpans(SpannedString.java:25) at android.text.SpannableStringInternal.<init>(SpannableStringInternal.java:40) at android.text.SpannableString.<init>(SpannableString.java:30) at android.widget.TextView.removeSuggestionSpans(TextView.java:4200) at android.widget.TextView.setText(TextView.java:3926) at android.widget.TextView.setText(TextView.java:3911) at android.widget.TextView.getIterableTextForAccessibility(TextView.java:9047) at android.view.View.onInitializeAccessibilityEventInternal(View.java:5450) at android.view.View.onInitializeAccessibilityEvent(View.java:5422) at android.widget.TextView.onInitializeAccessibilityEvent(TextView.java:8402) at android.view.View.sendAccessibilityEventUncheckedInternal(View.java:5293) at android.view.View.sendAccessibilityEventUnchecked(View.java:5280) at android.view.View.sendAccessibilityEventInternal(View.java:5257) at android.view.View.sendAccessibilityEvent(View.java:5226) at android.widget.TextView.sendAccessibilityEvent(TextView.java:8571) at android.widget.TextView.onSelectionChanged(TextView.java:7584) at android.widget.TextView.spanChange(TextView.java:7784) at android.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:9478) at android.text.SpannableStringInternal.sendSpanAdded(SpannableStringInternal.java:314) at android.text.SpannableStringInternal.setSpan(SpannableStringInternal.java:138) at android.text.SpannableString.setSpan(SpannableString.java:46) at android.text.SpannableStringInternal.<init>(SpannableStringInternal.java:52) at android.text.SpannableString.<init>(SpannableString.java:30) at android.widget.TextView.removeSuggestionSpans(TextView.java:4200) at android.widget.TextView.setText(TextView.java:3926) at android.widget.TextView.setText(TextView.java:3911) at android.widget.TextView.getIterableTextForAccessibility(TextView.java:9047) at android.view.View.onInitializeAccessibilityEventInternal(View.java:5450) at android.view.View.onInitializeAccessibilityEvent(View.java:5422) at android.widget.TextView.onInitializeAccessibilityEvent(TextView.java:8402) at android.view.View.sendAccessibilityEventUncheckedInternal(View.java:5293) at android.view.View.sendAccessibilityEventUnchecked(View.java:5280) at android.view.View.sendAccessibilityEventInternal(View.java:5257) at android.view.View.sendAccessibilityEvent(View.java:5226) at android.widget.TextView.sendAccessibilityEvent(TextView.java:8571) at android.widget.TextView.onSelectionChanged(TextView.java:7584) at android.widget.TextView.spanChange(TextView.java:7784) at android.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:9478) at android.text.SpannableStringInternal.sendSpanAdded(SpannableStringInternal.java:314) at android.text.SpannableStringInternal.setSpan(SpannableStringInternal.java:138) at android.text.SpannableString.setSpan(SpannableString.java:46) at android.text.SpannableStringInternal.<init>(SpannableStringInternal.java:52) at android.text.SpannableString.<init>(SpannableString.java:30) at android.widget.TextView.removeSuggestionSpans(TextView.java:4200) at android.widget.TextView.setText(TextView.java:3926) at android.widget.TextView.setText(TextView.java:3911) at android.widget.TextView.getIterableTextForAccessibility(TextView.java:9047) at android.view.View.onInitializeAccessibilityEventInternal(View.java:5450) at android.view.View.onInitializeAccessibilityEvent(View.java:5422) at android.widget.TextView.onInitializeAccessibilityEvent(TextView.java:8402) at android.view.View.sendAccessibilityEventUncheckedInternal(View.java:5293) at android.view.View.sendAccessibilityEventUnchecked(View.java:5280) at android.view.View.sendAccessibilityEventInternal(View.java:5257) at android.view.View.sendAccessibilityEvent(View.java:5226) at android.widget.TextView.sendAccessibilityEvent(TextView.java:8 09-13 00:48:45.483 8705-8705/club.apptu.edittextlocalhistory D/Error: ERR: TOTAL BYTES WRITTEN: 16156172 09-13 00:48:45.483 8705-8705/club.apptu.edittextlocalhistory E/JavaBinder: !!! FAILED BINDER TRANSACTION !!! 09-13 00:48:45.484 8705-8705/club.apptu.edittextlocalhistory E/AndroidRuntime: Error reporting crash android.os.TransactionTooLargeException at android.os.BinderProxy.transactNative(Native Method) at android.os.BinderProxy.transact(Binder.java:496) at android.app.ActivityManagerProxy.handleApplicationCrash(ActivityManagerNative.java:4144) at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:89) at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693) at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
Thanks in advance.
EDIT :
I'm getting problem when calling
notifyDatasetChanged
inListView#onItemClickListener
. -
shobhan about 8 yearsThanks for your response. that is not the actual problem. Even though I tried But the issue still not resolved.
-
shobhan about 8 yearsThe error occurred when I call notifyDatasetChanged() , but I can't find problem.
-
user192417 about 8 yearswhat is happening if you comment: myAdapter.notifyDataSetChanged();? first solution: replace myAdapter.notifyDataSetChanged(); to ((MyAdapter)listView.getAdapter()).notifyDataSetChanged(); if it's not work : try the second solution: runOnUIThread(new Runnable(){ myAdapter.notifyDataSetChanged(); })
-
Jay about 4 yearssimilar kind of issue. Thanks.