16 tháng 4, 2016

Android Filter Custom ListView (BaseAdapter) - Tùy Chỉnh Listview Lọc Danh Sách

Android Filter Custom ListView (BaseAdapter)

B1: Tạo File file :activity_main.xml
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp"
    tools:context=".MainActivity" >
    <!-- Editext for Search -->
    <SearchView
        android:id="@+id/search_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/search_view_border"
        android:iconifiedByDefault="false"
        android:padding="2dp"
        android:queryHint="Search...." />
     <!-- ListView -->
    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>
B1: Tạo XML list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="2dp" >
    <ImageView
        android:id="@+id/flag"
        android:layout_width="80dp"
        android:layout_height="70dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp" />
    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="10dp"
        android:layout_toRightOf="@+id/flag"
        android:paddingBottom="10dp"
        android:text="txt"
        android:textColor="#000000"
        android:textSize="20sp" />
    <TextView
        android:id="@+id/code"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/name"
        android:layout_below="@+id/name"
        android:layout_marginLeft="5dp"
        android:text="txt"
        android:textColor="#000000"
        android:textSize="16sp" />

</RelativeLayout>
B3: Tạo file Country.java
package com.pavan.customfilter;
public class Country {
    String name;
    String iso_code;
    int flag;
    Country(String name, String iso_code, int flag) {
        this.name = name;
        this.iso_code = iso_code;
        this.flag = flag;
    }
    public String getIso_code() {
        return iso_code;
    }
    public void setIso_code(String iso_code) {
        this.iso_code = iso_code;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getFlag() {
        return flag;
    }
    public void setFlag(int flag) {
        this.flag = flag;
    }
}

B4:Tạo Customadapte.java
package com.pavan.customfilter;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;

public class CustomAdapter extends BaseAdapter implements Filterable {
    Context context;
    ArrayList<Country> countrylist;
    ArrayList<Country> mStringFilterList;
    ValueFilter valueFilter;
    CustomAdapter(Context context , ArrayList<Country> countrylist) {
        this.context = context;
        this.countrylist = countrylist;
        mStringFilterList = countrylist;
    }
    @Override
    public int getCount() {
        return countrylist.size();
    }
    @Override
    public Object getItem(int position) {
        return countrylist.get(position);
    }
    @Override
    public long getItemId(int position) {
        return countrylist.indexOf(getItem(position));
    }
    @Override
    public View getView(int position , View convertView , ViewGroup parent ) {

        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        convertView = null;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_item, null);

            TextView name_tv = (TextView) convertView.findViewById(R.id.name);
            TextView iso_tv = (TextView) convertView.findViewById(R.id.code);
            ImageView iv = (ImageView) convertView.findViewById(R.id.flag);
            Country country = countrylist.get(position);
            name_tv.setText(country.getName());
            iso_tv.setText(country.getIso_code());
            iv.setImageResource(country.getFlag());
        }
        return convertView;
    }

    @Override
    public Filter getFilter() {
        if (valueFilter == null) {
            valueFilter = new ValueFilter();
        }
        return valueFilter;
    }
    private class ValueFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();

            if (constraint != null && constraint.length() > 0) {
                ArrayList<Country> filterList = new ArrayList<Country>();
                for (int i = 0; i < mStringFilterList.size(); i++) {
                    if ( (mStringFilterList.get(i).getName().toUpperCase() )
                            .contains(constraint.toString().toUpperCase())) {

                        Country country = new Country(mStringFilterList.get(i)
                                .getName() ,  mStringFilterList.get(i)
                                .getIso_code() ,  mStringFilterList.get(i)
                                .getFlag());

                        filterList.add(country);
                    }
                }
                results.count = filterList.size();
                results.values = filterList;
            } else {
                results.count = mStringFilterList.size();
                results.values = mStringFilterList;
            }
            return results;
        }
        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {
            countrylist = (ArrayList<Country>) results.values;
            notifyDataSetChanged();
        }
    }
}
B6: .Tạo file Mainactivity.java
package com.pavan.customfilter;
import java.util.ArrayList;
import android.app.Activity;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SearchView;

public class MainActivity extends Activity implements
        SearchView.OnQueryTextListener {

    ListView lv;
    SearchView search_view;

    String[] country_names , iso_codes ;
    TypedArray country_flags ;

    ArrayList<Country> countrylist ;
    CustomAdapter adapter;

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

        lv = (ListView) findViewById(R.id.list_view);
        search_view = (SearchView) findViewById(R.id.search_view);

        country_names = getResources().getStringArray(R.array.country_names);
        iso_codes = getResources().getStringArray(R.array.iso_Code);
        country_flags = getResources().obtainTypedArray(R.array.country_flags);

        countrylist = new ArrayList<Country>();
        for (int i = 0; i < country_names.length; i++) {
            Country country = new Country(country_names[i] , iso_codes[i] ,
                    country_flags.getResourceId(i, -1) );
            countrylist.add(country);
        }
        adapter = new CustomAdapter(getApplicationContext(), countrylist );
        lv.setAdapter(adapter);
        search_view.setOnQueryTextListener(this);
    }
    @Override
    public boolean onQueryTextChange(String newText) {
        adapter.getFilter().filter(newText);
        return false;
    }
    @Override
    public boolean onQueryTextSubmit(String query) {
        return false;
    }

}