Search code examples
androidlistviewandroid-fragmentsandroid-listfragment

Selected item in ListFragment doesn't get highlighted


I'm trying to highlight a previous selected item in my ListFragment but it's not working for me. The highlighting is the only issue since I'm able to see what I selected in the console but the coloring is just not working for whatever reason.

This is the code I use to highlight it

@Override
public void onStart() {
    super.onStart();
    ListView view = getListView();
    TextView previousSelected = null;
    int selectedPosition = 0;
    if(view != null) {
        int adapterSize = view.getAdapter().getCount();
        if (selectedView != null) {
            for (int i = 0; i < adapterSize; i++) {
                Log.d(TAG, "view getchildat " + view.getAdapter().getView(i, null, view) + " selected " + selectedView);
                if (((TextView) view.getAdapter().getView(i, null, view)).getText().toString().equalsIgnoreCase(((TextView) selectedView).getText().toString())){
                    previousSelected = (TextView) view.getAdapter().getView(i, null, view);
                    Log.d(TAG, "selected is " + previousSelected.getText().toString());
                    view.setSelection(i);
                    view.setSelected(true);
                    view.setFocusable(true);
                    selectedPosition = i;
                }
            }
        } else if (tagScan.getLastFeedback()[0] != null) {
            Log.d(TAG, "count fragment is " + count);
            for(int i = 0; i < adapterSize; i++){
                Log.d(TAG, "view getchildat " + ((TextView)view.getAdapter().getView(i, null, view)).getText().toString() + " selected " + tagScan.getLastFeedback()[count]);
                if (((TextView) view.getAdapter().getView(i, null, view)).getText().toString().equalsIgnoreCase(tagScan.getLastFeedback()[count])){
                    previousSelected = (TextView) view.getAdapter().getView(i, null, view);
                    Log.d(TAG, "selected is " + previousSelected.getText().toString());
                    view.setSelection(i);
                    view.setSelected(true);
                    view.setFocusable(true);
                }
            }
        }
        if(previousSelected != null){
            Log.d(TAG,"set color of the previous selection " + previousSelected.getText().toString());
            previousSelected.setBackgroundColor(Color.BLUE);
            previousSelected.setTextColor(Color.WHITE);
            selectedView = previousSelected;

        }
    }
}

I've tried to use selectors, but no luck there either:

 <?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_selected="true"
        android:drawable="@drawable/list_selector_selected"/>
    <item
        android:state_activated="true"
        android:drawable="@drawable/list_selector_selected"/>
    <item
        android:state_focused="true"
        android:drawable="@drawable/list_selector_selected"/>
    <item
        android:state_pressed="true"
        android:drawable="@drawable/list_selector_selected"/>
    <!--<item-->
        <!--android:drawable="@drawable/list_selector_selected" />-->
</selector>

The highlighting works fine in an onClickListener for me so I'm not sure why it's not working in the onStart.


Solution

  • Fixed it by override the getView of the adapter like so

    new ArrayAdapter<String>(this, R.layout.feedback_list, feedback.getOptions()){
                                @Override
                                public View getView(int position, View convertView, ViewGroup parent) {
                                    View view = super.getView(position, convertView, parent);
                                    Log.d(TAG,"view is " + view + " selected is " + listFragment.selectedView);
                                    if(listFragment.selectedPosition != null) {
                                        if (listFragment.selectedPosition[0] == position) {
                                            view.setBackgroundColor(R.color.colorPrimary);
                                        }
                                    }
                                    return view;
                                }
                            };