emen
emen

Reputation: 6318

TextWatcher filter isn't working correctly after popBackStack

I have a ListView that contains an EditText to filter list result. Everything is working well during this phase.

My problem is after clicking an item in the list and then go back to the ListView, the item in the list is gone, most probably the because EditText contains an empty space after back button is pressed. Why is this so?

I've put a Log inside onTextChanged to see what character is being put when the back button is pressed. It's just blank. I'm not sure why this listener adds an empty space and filter the result after back button is pressed.

Here is the code in ListFragment:

public class CategoryFragment extends ListFragment {

    ...

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {

        // filter result
        etFilterCategory.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
                // Log.d(TAG, "ontextchanged= " + charSequence);
                va.getFilter().filter(charSequence);
            }

            @Override
            public void afterTextChanged(Editable editable) {
            }
        });
    }
}

The BaseAdapter implementing Filterable:

public class CategoryAdapter extends ArrayAdapter<CategoryModel> implements
        Filterable {

    ...

    @Override
    public Filter getFilter() {
        return mFilter;
    }

    private class ItemFilter extends Filter {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            String filterString = constraint.toString().toLowerCase();
            FilterResults results = new FilterResults();
            final ArrayList<CategoryModel> list = originalData;

            int count = list.size();

            final ArrayList<CategoryModel> nlist = new ArrayList<CategoryModel>(count);

            String filterableString;

            for (int i = 0; i < count; i++) {
                filterableString = list.get(i).getName();
                if(filterableString.toLowerCase().contains(filterString)) {
                    // add the whole custom row
                    nlist.add(list.get(i));
                }
            }

            results.values = nlist;
            results.count = nlist.size();

            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            arrCategory = (ArrayList<CategoryModel>) results.values;
            notifyDataSetChanged();
        }
    }
}

How do I NOT make the ListView item filtered after every back button pressed?


EDIT:

After back button is pressed, the only way to make the ListView visible is to add a space into the EditText and remove it. That will show the previous list. What did I missed?

Upvotes: 1

Views: 706

Answers (1)

dinesh sharma
dinesh sharma

Reputation: 3332

you may be re-creating your listAdapter object, this will nullify the previously created listAdapter.

Your call of textwatcher is pointing to older listadapter where in onResume/OnCreateView event your new instance of listadapter is generated.

I solved my problem by declaring listadapter object as member in my fragment and checking it in onResume method as follow

@Override
public void onResume() {
    super.onResume();
    if (news == null) {
        if(CommonFun.isInternetOn(activity))
            new NewsRetrivalTask().execute();
        else
            ToastMsg.showToast(activity, Msg.alertInternetMsg);
    } else {
        newsListAdapter = new NewsListAdapter(getActivity(), news);
        lv.setAdapter(newsListAdapter);
        lv.setOnItemClickListener(MAP_FragmentChatRoom.this);
        lv.setVisibility(View.VISIBLE);
        tvNoRecord.setVisibility(View.GONE);
    }
}

and textwatcher in onCreateView method

  etSearch.addTextChangedListener(new TextWatcher() {
        public void afterTextChanged(Editable s) { }

        public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

        public void onTextChanged(CharSequence s, int start, int before, int count) {
            newsListAdapter.getFilter().filter(s);
        }
    });

Upvotes: 1

Related Questions