آموزش جستجو در RecyclerView در برنامه نویسی اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش جستجو در RecyclerView در برنامه نویسی اندروید می پردازیم برای جستجو از EditText استفاده می کنیم در ادامه با ما همراه باشید تا نحوه استفاده از آن را یاد بگیرید.
در قبل آموزش ConstraintLayout را قرار دادیم و از این به بعد بیشتر آموزش ما بخش Layout آن شامل ConstraintLayout خواهد بود پس اگر آن را مطالعه نکردید در سایت جستجو کنید و همینطور RecyclerView را هم در شکل و ها و انواع مختلف برای شما مثال زدیم می توانید برای تکمیل شدن آموزش به آنها رجوع کنید.
ابتدای امر چون از RecyclerView و CardView استفاده می کنیم باید کتاب خانه آن ها را اضافه کنیم.
پس وارد فایل Build.gradle شده از نوع module و خط زیر را به آن اضافه کنید.
1 2 | compile 'com.android.support:recyclerview-v7:23.4.0' compile 'com.android.support:cardview-v7:23.3.+' |
هم اکنون پروژه را sync کنید علت خطاهای گریدل را قبلا بررسی کرده ایم.
حالا در بخش layout خودمان کد های زیر را قرار می دهیم اسم layout ما برابر با activity_main.xml است .
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 | <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="net.simplifiedlearning.recyclerviewsearch.MainActivity"> <EditText android:id="@+id/editTextSearch" android:layout_width="0dp" android:layout_height="wrap_content" android:hint="Enter search term" tools:layout_constraintTop_creator="1" tools:layout_constraintRight_creator="1" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" app:layout_constraintRight_toRightOf="parent" android:layout_marginTop="16dp" tools:layout_constraintLeft_creator="1" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" /> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="0dp" android:layout_height="0dp" tools:layout_constraintTop_creator="1" tools:layout_constraintRight_creator="1" tools:layout_constraintBottom_creator="1" android:layout_marginStart="8dp" app:layout_constraintBottom_toBottomOf="parent" android:layout_marginEnd="8dp" app:layout_constraintRight_toRightOf="parent" android:layout_marginTop="8dp" app:layout_constraintTop_toBottomOf="@+id/editTextSearch" tools:layout_constraintLeft_creator="1" android:layout_marginBottom="8dp" app:layout_constraintLeft_toLeftOf="parent" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintVertical_bias="1.0"> </android.support.v7.widget.RecyclerView> </android.support.constraint.ConstraintLayout> |
دوستان تعجب نکنید گفتم باید حتما آموزش ConstraintLayout را مطالعه کنید تا متوجه شوید این کدها از کجا آماده اند اگر دوست نداشتید بدانید در بالا فقط یک EditText و یک Recyclerview قرار گرفته است بقیه کد ها مربوط به ConstraintLayout است.کد بالا layout به شکل زیر ایجاد می کند.
حالا یک فایل برای لیست آیتم های خودمان درست می کنیم این لیست در RecyclerView نمایش داده می شود.
پس یک فایل به نام list_layout.xml در پوشه layout ایجاد می کنیم و کد زیر را در آن قرار می دهیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <android.support.v7.widget.CardView android:layout_marginTop="5dp" android:layout_marginBottom="5dp" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/textViewName" android:padding="15dp" android:textAppearance="@style/Base.TextAppearance.AppCompat.Large" android:layout_width="match_parent" android:layout_height="wrap_content" /> </android.support.v7.widget.CardView> </LinearLayout> |
لیست ما شامل یک CardView است که در آن یک TextView گنجانده شده است.
مثل همیشه باید آداپتور خودمان را ایجاد کنیم پس یک فایل جاوا به نام CustomAdapter.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 | package ir.programchi; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.ArrayList; /** * Created by Jfp on 6/6/2017. */ public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> { private ArrayList<String> names; public CustomAdapter(ArrayList<String> names) { this.names = names; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.list_layout, parent, false); return new ViewHolder(v); } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.textViewName.setText(names.get(position)); } @Override public int getItemCount() { return names.size(); } class ViewHolder extends RecyclerView.ViewHolder { TextView textViewName; ViewHolder(View itemView) { super(itemView); textViewName = (TextView) itemView.findViewById(R.id.textViewName); } } public void filterList(ArrayList<String> filterdNames) { this.names = filterdNames; notifyDataSetChanged(); } } |
فکر می کنم این کلاس رو حدودا 8 بار توضیح داده ام در سایت جستجو کنید.
حالا کد مربوط به اکتیویتی اصلیمان را قرار میدهیم نام آن برابر با 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 | package ir.programchi; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.Editable; import android.text.TextWatcher; import android.widget.EditText; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { RecyclerView recyclerView; EditText editTextSearch; ArrayList<String> names; CustomAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); names = new ArrayList<>(); names.add("Iran"); names.add("America"); names.add("Canada"); names.add("South Korea"); names.add("Pakistan"); names.add("Yaman"); names.add("Qatar"); names.add("Turkey"); names.add("Somalia"); names.add("Kenya"); names.add("ethiopia"); recyclerView = (RecyclerView) findViewById(R.id.recyclerView); editTextSearch = (EditText) findViewById(R.id.editTextSearch); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(this)); adapter = new CustomAdapter(names); recyclerView.setAdapter(adapter); } } |
در ابتدا view مربوط به هر کدام را به دست آوردیم سپس در بالا ما یکسری داده sample به RecyclerView خودمان اضافه کردیم.
حالا برای اینکه بخش سرچ ما تکمیل شود کد های زیر را به اکتیویتی بالا اضافه کنید.
ابتدا باید یک void ایجاد کنیم که کار فیلتر را انجام دهد مثل زیر
1 2 3 4 5 6 7 8 9 | private void filter(String text) { ArrayList<String> filterdNames = new ArrayList<>(); for (String s : names) { if (s.toLowerCase().contains(text.toLowerCase())) { filterdNames.add(s); } } adapter.filterList(filterdNames); } |
و حالا باید از این فیلتر درست شده استفاده کنیم همانند زیر
1 2 3 4 5 6 7 8 9 10 11 12 | editTextSearch.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void afterTextChanged(Editable editable) { filter(editable.toString()); } }); |
به علت اینکه میدونم 90 درصد کاربرای ما آماتورن کد اصلی رو به صورت تکمیلی در زیر قرار میدم
پس در آخر 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 49 50 51 52 53 54 55 56 57 58 59 | package net.ir.programchi; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.Editable; import android.text.TextWatcher; import android.widget.EditText; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { RecyclerView recyclerView; EditText editTextSearch; ArrayList<String> names; CustomAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); names = new ArrayList<>(); names.add("Ramiz"); names.add("Belal"); names.add("Azad"); names.add("Manish"); names.add("Sunny"); names.add("Shahid"); names.add("Deepak"); names.add("Deepika"); names.add("Sumit"); names.add("Mehtab"); names.add("Vivek"); recyclerView = (RecyclerView) findViewById(R.id.recyclerView); editTextSearch = (EditText) findViewById(R.id.editTextSearch); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(this)); adapter = new CustomAdapter(names); recyclerView.setAdapter(adapter); editTextSearch.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void afterTextChanged(Editable editable) { filter(editable.toString()); } }); } private void filter(String text) { ArrayList<String> filterdNames = new ArrayList<>(); for (String s : names) { if (s.toLowerCase().contains(text.toLowerCase())) { filterdNames.add(s); } } adapter.filterList(filterdNames); } } |
سلام،ممنون از اموزش خوب شما
من توی نرم افزار از یک کلاس Initalizer استفاده کردم
این روش سرچ روی اون حالت جواب نمیده
راه حلی براش سراغ دارید؟
روش های مختلفی وجود دارد ما در اینجا به صورت کلی به آن پرداخته ایم.
بخشی از کد Initializer را قرار دهید تا بهتر بتونم کمکمتون کنم ولی حتما باید notifyDataSetChanged استفاده شود از کد های زیر استفاده کنید شاید به جواب رسیدید.
توی آداپتورتون کد زیر را قرار دهید.
و در همان جا برای سرچ کردن کد زیر را قرار دهید.
موفق باشید.
ممنون از شما
کدها رو به شکل زیر استفاده کردم اما جوابی نگرفتم
}
کد های mainActivity
کد های کلاس iniatalizer
ممنون که وقت میذارید
یه مطلبی پیدا کردم فکر می کنم مشکل شما را حل می کند از searchview باید استفاده کنید مثل زیر عمل کنید.
در بخشی که می خواید سرچ کنید searchview زیر را قرار دهید.
در آداپتور کد زیر را قرار دهید.
در بالا mFilteredList شناخته نمی شود شما باید یک آرایه به نام mFilteredList درست کنید مثل زیر
و داده هاتون رو در آن قرار دهید.
کد زیر را void است در جای مناسب همان اکتیویتی قرار دهید.
و در نهایت با استفاده از کد زیر آن را فیلتر کنید.
سپس view مربوط به searchview را به دست بیارید مثل زیر
موفق باشید.
سپاس گذارم خیلی زحمت کشیدید
خواهش می کنم.
با سلام
متد getFilter مربوط به چه کلاسیست؟
چون برنامه من این متد رو نمیشناسه و خطا میده….
کلاس Filterable رو هم import کردم ولی تاثیری نداشت…
سپاس از راهنماییاتون
این یک کلاس Custom است که override شده است.
سلام
کلاس AndroidVersion چه کلاسیست چون برنامه من نمیشناسه این کلاسو؟
اگه کلاس رو خودتون ساختین، برای چه چیزی این کلاس رو ساختین؟
سلام خیر کلاس کاستوم نیست برای اندروید استودیو است.
ممنون سایت فوق العاده ای دارید.
خیلی استفاده کردم.
با سلام و خسته نباشید و تشکر از مطالب مفیدتون
من توی recyclerView یک ستون ادیت قرار دادم که مقدار اون را هنگام اجرای برنامه تغییر میدم
حالا می خواهم به اون ستون دسترسی داشته باشم و مقدارشون را بخونم ولی تنها به چند تا که دیده میشن میشه دسترسی داشت و بقیه را موقع خوندن خطا میده، با دیتایی که هم واسه آداپتور ساختم فقط میشه مقادیر ثابت را بعد از پر کردن خوند و مقادیر همین ستون که تغییر داده میشه خونده نمیشن
با تشکر
شما باید آداپتورتون فابلیت سرچ را داشته باشد و آن بخش را که برای کلید سرچ در نظر گرفته مثلا Title را باید در برنامه نشان دهید ولی اگر می خواهید نشان داده نشود در اداپتور ست کرده فقط آن را نمایش ندهید.
موفق باشید.