آموزش SearchView در برنامه نویسی اندروید

سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش SearchView در برنامه نویسی اندروید می پردازیم برای اینکه ما بتونیم در یک لیستی جستجو کنیم باید از SearchView استفاده کنیم در ادامه می توانید پیش نمایشی از این SearchView را مشاهده کنید.

 
حالا یک فایل به نام activity_main.xml ایجاد می کنیم و کد های زیر را در آن قرار می دهیم.

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <android.support.v7.widget.SearchView
            android:id="@+id/search"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:clickable="true" />
        <ListView
            android:id="@+id/list_view"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_below="@+id/search" />
    </RelativeLayout>
</layout>

در بالا ما یک لیست داریم و یک SearchView در بالای آن.
قبل از اینکه وارد بخش کد برنامه بشویم باید یکسری تغییرات در فایل گریدل خود انجام دهید وارد فایل Build.gradle شده از نوع Module سپس کد زیر را اضافه کنید.

dataBinding {
        enabled = true
    }

این گزینه بسیار مهم است در صورتی که فعال نشود در برنامه به خطا بر خواهید خورد
ابتدا یک فایل به نام row_item.xml ایجاد کرده و کد های زیر را در آن قرار دهید (این هر آیتم از ListView ما است.)

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/stringName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_centerVertical="true"
            android:padding="@dimen/activity_horizontal_margin"
            android:textAllCaps="false"
            android:textAppearance="?android:attr/textAppearanceMedium" />
    </RelativeLayout>
</layout>

حالا باید آداپتور مربوط به این کلاس را ایجاد کنیم تا بتوانیم داده های sample را در آن قرار دهیم.
پس یک فایل به نام ListAdapter.java ایجاد کرده و کدهای زیر را در آن قرار دهید.

package ir.programchi;
import android.content.Context;
import android.databinding.DataBindingUtil;
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 ir.programchi.databinding.RowItemBinding;
import java.util.ArrayList;
import java.util.List;
public class ListAdapter extends BaseAdapter implements Filterable {
    List mData;
    List mStringFilterList;
    ValueFilter valueFilter;
    private LayoutInflater inflater;
    public ListAdapter(List cancel_type) {
        mData=cancel_type;
        mStringFilterList = cancel_type;
    }
    @Override
    public int getCount() {
        return mData.size();
    }
    @Override
    public String getItem(int position) {
        return mData.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(int position, View convertView, final ViewGroup parent) {
        if (inflater == null) {
            inflater = (LayoutInflater) parent.getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
        RowItemBinding rowItemBinding = DataBindingUtil.inflate(inflater, R.layout.row_item, parent, false);
        rowItemBinding.stringName.setText(mData.get(position));
        return rowItemBinding.getRoot();
    }
    @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) {
                List filterList = new ArrayList();
                for (int i = 0; i < mStringFilterList.size(); i++) {
                    if ((mStringFilterList.get(i).toUpperCase()).contains(constraint.toString().toUpperCase())) {
                        filterList.add(mStringFilterList.get(i));
                    }
                }
                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) {
            mData = (List) results.values;
            notifyDataSetChanged();
        }
    }
}

و در آخر کد مربوط به MainActivity.java همانند زیر می شود.

package ir.programchi;
import android.databinding.DataBindingUtil;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.SearchView;
import ir.programchi.databinding.ActivityMainBinding;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
    ActivityMainBinding activityMainBinding;
    ListAdapter adapter;
    List arrayList= new ArrayList();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        arrayList.add("January");
        arrayList.add("February");
        arrayList.add("March");
        arrayList.add("April");
        arrayList.add("May");
        arrayList.add("June");
        arrayList.add("July");
        arrayList.add("August");
        arrayList.add("September");
        arrayList.add("October");
        arrayList.add("November");
        arrayList.add("December");
        adapter= new ListAdapter(arrayList);
        activityMainBinding.listView.setAdapter(adapter);
        activityMainBinding.search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }
            @Override
            public boolean onQueryTextChange(String newText) {
                adapter.getFilter().filter(newText);
                return false;
            }
        });
        activityMainBinding.search.setActivated(true);
        activityMainBinding.search.setQueryHint("Type your keyword here");
        activityMainBinding.search.onActionViewExpanded();
        activityMainBinding.search.setIconified(false);
        activityMainBinding.search.clearFocus();
    }
}

 
ابتدا دادهای sample را اضافه کردیم سپس با استفاده از setOnQueryTextListener برای SearchView خودمان یک لیستنر تعریف کردیم تا مقدارسرچ را فیلتر کند از queryhint هم برای قرار دادن یک متن استفاده شده است البته از نوع hint و setActivated برای فعال سازی فیلتر استفاده شده است.
 
این آموزش هم به پایان رسید.
 
موفق و موید باشید.

مطالعه بیشتر