آموزش ساخت search view در اندروید استودیو
ویجت SearchView در اندروید، رابط کاربر جستجو را فراهم می کند که کاربران می توانند یک عبارت را در جستجو وارد کنند و سپس یک درخواست برای ارائه دهنده جستجو ارسال کنند.
این فهرست لیستی از پیشنهادات یا نتایج پرس و جو را در صورت موجود بودن نشان می دهد و به کاربران اجازه می دهد تا پیشنهاد یا نتیجه را برای راه اندازی انتخاب کنند.
در اینجا ما از یک SearchView و لیست ویو استفاده کرده ایم
برای این کار میتوناید کد زیر را در xml خود بگذارید :
کد های 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>
کد های MainActivity.jsvs :
package ir.devhelp; 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(); } }
در کد بالا ما Array List را به Adapter منتفل کرده ایم
هر موقع که در بخش جستجو عبارتی که در ArrayList قبلا نوشته شده است، جستجو شود Adapter آن را فراخوانی میکند و در بخش لیست ویو نشان میدهد.
یک کلاس جدید بسازید و نام آن را ListAdapter.java بگذارید
کد های ListAdapter به صورت زیر است :
package ir.devhelp; 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(); } } }
همانطور که در کد بالا مشاهده میکنید، ما با استفاده از یک ارزش افزوده کلاس داخلی که کلاس فیلتر را گسترش می دهد، این لیست را با چک کردن متن فیلتر میکنیم اینکه آیا جستجو در متن با رشته های داده شده در ArrayList مطابقت دارد یا خیر .
ما آیتم های جستجو را در xml زیر قرار دادیم
یک xml جدید بسازید و نام آن را row_item.xml بگذارید
کد های row_item.xml :
-
<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>
برنامه را جرا کنید
تمام…
مشکلی داشتید در بخش دیگاه بنویسید تا جواب دهیم.
سلام
وقت بخیر
من یه سرچ ویو ساختم
میخوام وقتی کاربر متن مورد نظرشو تایپ کرد و لیست ویو گزینه های همخوان و بهش نشون داد روی هر کدوم که کلیک کرد بره به اون صفحه
ممنون از پاسخگویی تون
سلام
وقت بخیر
من یه سرچ ویو ساختم
میخوام وقتی کاربر متن مورد نظرشو تایپ کرد و لیست ویو گزینه های همخوان و بهش نشون داد روی هر کدوم که کلیک کرد بره به اون صفحه
ممنون از پاسخگویی تون