آموزس ساخت Search View حرفه ای در اندروید استودیو

آموزش ساخت 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>

     

برنامه را جرا کنید
 
 
Search view
 

تمام…

مشکلی داشتید در بخش دیگاه بنویسید تا جواب دهیم.
 
 

مطلب مفیدی برای شما بود ؟ پس به اشتراک بگذارید برای دوستانتان

codesrcReza

109 مطلب منتشر شده

درباره این مطلب نظر دهید !