Search code examples
listviewfilterandroid-edittextfragmentusing

Filter listitem in tab fragment using the edittext present in the actionbar


MainActivitycode

public class MainActivity extends ActionBarActivity {

// Declaring Your View and Variables

Toolbar toolbar;
ViewPager pager;
ViewPagerAdapter adapter;
SlidingTabLayout tabs;
Tab1 tab1obj=new Tab1();

CharSequence Titles[]={"Locations","Lines"};

int Numboftabs =2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final TextView inputSearch = (TextView) findViewById(R.id.inputSearch);
    // Creating The Toolbar and setting it as the Toolbar for the activity
    inputSearch.setHint("Where do you want to go?");

    toolbar = (Toolbar) findViewById(R.id.tool_bar);
    setSupportActionBar(toolbar);


    // Creating The ViewPagerAdapter and Passing Fragment Manager, Titles fot the Tabs and Number Of Tabs.
    adapter =  new ViewPagerAdapter(getSupportFragmentManager(),Titles,Numboftabs);

    // Assigning ViewPager View and setting the adapter
    pager = (ViewPager) findViewById(R.id.pager);
    pager.setAdapter(adapter);
    pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            if(position==0)
                inputSearch.setHint("Where do you want to go?");
            else
                inputSearch.setHint("Search for bus route lines");


        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

    // Assiging the Sliding Tab Layout View
    tabs = (SlidingTabLayout) findViewById(R.id.tabs);
    tabs.setDistributeEvenly(true); // To make the Tabs Fixed set this true, This makes the tabs Space Evenly in Available width

    // Setting Custom Color for the Scroll bar indicator of the Tab View
    tabs.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() {
        @Override
        public int getIndicatorColor(int position) {
            return getResources().getColor(R.color.tabsScrollColor);
        }
    });

    // Setting the ViewPager For the SlidingTabsLayout
    tabs.setViewPager(pager);



}
}

Tab1 code

public class Tab1 extends Fragment {

private ListView mListView;
private View rootView;
private ListviewContactAdapter adapter;
private ArrayList<ListviewContactItem> listContact;

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.tab1, container, false);

    mListView = (ListView) rootView.findViewById(R.id.list);
    listContact = GetlistContact();
    adapter=new ListviewContactAdapter(getActivity(), listContact);
    mListView.setAdapter(adapter);

    return rootView;
}
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
}

private ArrayList<ListviewContactItem> GetlistContact(){
    ArrayList<ListviewContactItem> contactlist = new ArrayList<ListviewContactItem>();

    ListviewContactItem contact = new ListviewContactItem();

    contact.setPickUpPoint("xyz");
    contact.setArea("xyz City");
    contact.setLandmark("xyz xyz");
    contact.setStreetName("xyz Road");
    contactlist.add(contact);


    contact = new ListviewContactItem();
    contact.setPickUpPoint("xyz");
    contact.setArea("xyz City");
    contact.setLandmark("xyz xyz");
    contact.setStreetName("xyz Road");
    contactlist.add(contact);

    contact = new ListviewContactItem();
    contact.setPickUpPoint("vxyz");
    contact.setArea("xyz City");
    contact.setLandmark("near xyz");
    contact.setStreetName("xyz Road");
    contactlist.add(contact);

}
}

CustomAdapter code

public class ListviewContactAdapter extends BaseAdapter implements Filterable {
private static ArrayList<ListviewContactItem> listContact=null;
private static ArrayList<ListviewContactItem> originaldata=null;

private LayoutInflater mInflater;
private Context context;

public ListviewContactAdapter(Context photosFragment, ArrayList<ListviewContactItem> results){
    listContact = results;
    originaldata=results;
 //   mInflater = LayoutInflater.from(photosFragment);
    this.context=photosFragment;
    this.originaldata = new ArrayList<ListviewContactItem>();
    this.originaldata.addAll(results);
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return listContact.size();
}

@Override
public Object getItem(int arg0) {
    // TODO Auto-generated method stub
    return listContact.get(arg0);
}

@Override
public long getItemId(int arg0) {
    // TODO Auto-generated method stub
    return arg0;
}


public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    ViewHolder holder;
    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if(convertView == null){
        convertView = mInflater.inflate(R.layout.pickup_point_list_layout, null);
        holder = new ViewHolder();
        holder.txtpickuppoint = (TextView) convertView.findViewById(R.id.rd_header_text);
        holder.txtarea = (TextView) convertView.findViewById(R.id.area);
        holder.txtlandmark = (TextView) convertView.findViewById(R.id.landmark);
        holder.txtstreetname = (TextView) convertView.findViewById(R.id.streetname);

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.txtpickuppoint.setText(listContact.get(position).getPickUpPoint());
    holder.txtarea.setText(listContact.get(position).getArea());
    holder.txtlandmark.setText(listContact.get(position).getLandmark());
    holder.txtstreetname.setText(listContact.get(position).getStreetName());

    return convertView;
}

static class ViewHolder{
    TextView txtpickuppoint, txtarea,txtlandmark,txtstreetname;
}
}

Now i want to implement the search filter on the listview present in the fragment of the tab using the edit text in the actionbar. Please guide me on how to do that. As soon as the user enters the text, the list should start showing filtered items.


Solution

  • Well i have finally got the answer for the question. All i had to do is this in my main activity

        inputSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }
    
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                //clear.setVisibility(View.VISIBLE);
            }
    
            @Override
            public void afterTextChanged(Editable s) {
                LocationTab parFrag = (LocationTab) adapter.instantiateItem(pager, 0);
    
                parFrag.doSearch(s);
            }
        });
    

    and in my LocationTab declare a parameter function.

    public void doSearch(CharSequence s) {
       // Log.e("TAG","char="+s);
        LocationTab.this.adapter.getFilter().filter(s);
    }
    

    Hope this helps someone like me ;)