آموزش SearchView در برنامه نویسی اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش SearchView در برنامه نویسی اندروید می پردازیم برای اینکه ما بتونیم در یک لیستی جستجو کنیم باید از SearchView استفاده کنیم در ادامه می توانید پیش نمایشی از این SearchView را مشاهده کنید.
حالا یک فایل به نام activity_main.xml ایجاد می کنیم و کد های زیر را در آن قرار می دهیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?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 سپس کد زیر را اضافه کنید.
1 2 3 | dataBinding { enabled = true } |
این گزینه بسیار مهم است در صورتی که فعال نشود در برنامه به خطا بر خواهید خورد
ابتدا یک فایل به نام row_item.xml ایجاد کرده و کد های زیر را در آن قرار دهید (این هر آیتم از ListView ما است.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <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 ایجاد کرده و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | 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 همانند زیر می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | 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 برای فعال سازی فیلتر استفاده شده است.
این آموزش هم به پایان رسید.
موفق و موید باشید.
سلام ممنون از اموزش های خوبتان
وقتی
import ir.programchi.databinding.ActivityMainBinding;
می گذارم ارور میده اسم پکیجخودمم گذاشتم بازم ارور میده
این که نوشتین کاملا اشتباس و 2 تا چیز مختلف هستند.دقت کنید تو کدا متوجه میشید.
package ir.programchi;
import android.databinding.DataBindingUtil;
سلام
اگر بخوایم یه فایل xml رو بدیم به inflate و بخوایم تمام اجزاش در دسترسمون باشه چی ؟؟
ببینید میخوام یه لیست ویو سفارشی بسازم که حاوی یه Button ، دوتا TextView و یه CheckBox باشه .. ..چک باکس ها برای زمانی هست که میخوام حذف رو انجام بدم و دکمه برای زمانیه که اطلاعاتی رو نمایش بده … اینها رو ساختم ولی کار نمیکنند ..به نظرتون مشکل از کجاست ؟؟؟
سلام و درود شما اگر توی شئی اومدید این کار رو کردید یعنی خود view سرچ رو اومدید سفارشی کردید باید یک ورودی به Constructor بفرستید تا بتونید روی view ها کار کنید ولی از چیزی که فرمودید فکر نمی کنم همچین کاری کرده باشید ولی کلیت کار نیازمند یک Adapter سفارشی هست که عملیات در adapter انجام می شود در سایت لیست رو سرچ کنید آموزشش هست .
موفق باشید.
سلام و وقت بخیر خدمت شما
مشخصه های طول و عرض searchview طوری باید تعریف کرد که لیست ویو یا ریسایکل ویو رو هم در بر بگیره یا اینکه این دو قسمت مجزا از هم هستن…؟
یعنی ریسایکل ویو داخل سرچ ویو قرار میگیره یا نه؟
و اینکه چطور میشه رنگ نوشته هایی که کاربر مینویسه داخل سرچ ویو رو تغییر داد؟
و آیکونش رو راست چین قرار داد؟
سلام
علت ساخت یع اکتیویتی دیگه به نام DataBinding چیه؟
و اینکنه برنامه من حین نوشتن کد زیر ارور میده…
activityMainBindig = DataBindingUtil.setContentView(this, R.layout.activity_university);
علت چی میتونه باشه؟
سلام اکتیویتی به نام DataBinding وجود ندارد بلکه یک ویژگی به نام Bind کردن یک ویژگی در گریدل است لینک زیر را مطالع کنید.
DataBindingUtil یکی از کلاس های خود اندروید استودیو است import هاتون مشکل داره یک بار پاک کرده دوباره import کنید.
http://programchi.ir/?s=binding
موفق باشید.