java.lang.StackOverflowError: stack size 8MB while Enabling/Disabling TextView#setTextIsSelectable in ListView Adapter

26,400

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.

Share:
26,400
shobhan
Author by

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, 2022

Comments

  • shobhan
    shobhan almost 2 years

    I have an activity with ListView . Displaying the TextView in each list item. Switching the properties of selected position using these methods EditText#setTextIsSelectable , EditText#setEllipsize & EditText#setSingleLine . clicking on 1st item is working good. But while clicking on another item I'm getting StackOverFlowError.

    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 in ListView#onItemClickListener .

  • shobhan
    shobhan about 8 years
    Thanks for your response. that is not the actual problem. Even though I tried But the issue still not resolved.
  • shobhan
    shobhan about 8 years
    The error occurred when I call notifyDatasetChanged() , but I can't find problem.
  • user192417
    user192417 about 8 years
    what 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
    Jay about 4 years
    similar kind of issue. Thanks.