آموزش ایجاد رویداد کلیک در RecyclerView
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش ایجاد رویداد کلیک در RecyclerView می پردازیم قبلتر آموزش های مربوط به CardView و RecyclerView را در سایت قرار داده بودیم و به طور کامل آنها را بررسی کرده بودیم در ادامه با ما همراه باشید.
در ابتدای کار چون داریم از CardView و RecyclerView استفاده می کنیم باید کتاب خانه های آن را اضافه کنیم.
پس وارد فایل Build.gradle از نوع module شده و در بخش dependencies خط زیر را اضافه کنید.
1 2 | compile 'com.android.support:cardview-v7:23.0.+' compile 'com.android.support:recyclerview-v7:23.0.+' |
وارد فایل activity_main.xml شده و کد زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 | <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview1" android:scrollbars="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"/> </RelativeLayout> |
در بالا یک RecyclerView قرار داده ایم.
حالا یک فایل به نام cardview_item.xml ایجاد کنید و کد زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/cardview" android:layout_width="match_parent" android:layout_height="wrap_content" card_view:cardCornerRadius="6dp" card_view:cardElevation="6dp" card_view:contentPadding="7dp" card_view:cardBackgroundColor="#FF9800" > <TextView android:id="@+id/textview1" android:layout_gravity="center" android:textSize="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textStyle="bold" android:layout_marginTop="3dp" android:layout_marginBottom="3dp" android:textColor="#FFF3E0"/> </android.support.v7.widget.CardView> |
در بالا ما شکل ظاهری cardView که می خواهد نمایش داده شود را تنظیم می کنیم.
چون ما در اینجا آیتم سفارشی درست کردیم پس باید براش آداپتور درست کنیم.
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 | package ir.programchi; /** * Created by Jefferson on 8/14/2016. */ 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; public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> { ArrayList<String> SubjectNames; View view1; public RecyclerViewAdapter(ArrayList<String> SubjectNames1) { this.SubjectNames = SubjectNames1; } @Override public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { view1 = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.cardview_item, viewGroup, false); return new ViewHolder(view1); } @Override public void onBindViewHolder(RecyclerViewAdapter.ViewHolder Viewholder, int i) { Viewholder.SubjectTextView.setText(SubjectNames.get(i)); } @Override public int getItemCount() { return SubjectNames.size(); } public class ViewHolder extends RecyclerView.ViewHolder{ TextView SubjectTextView; public ViewHolder(View view) { super(view); SubjectTextView = (TextView)view.findViewById(R.id.textview1); } } } |
در صورتی که می خواهید بیشتر با آداپتور آشنا شوید در سایت جستجو کنید آموزش های مرتبط بسیار زیاد است.
و در آخر هم کد مربوط به 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 60 | 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 java.util.ArrayList; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.widget.Toast; public class MainActivity extends AppCompatActivity { ArrayList<String> SubjectNames; RecyclerView recyclerview; RecyclerView.LayoutManager RecyclerViewLayoutManager; View ChildView ; int RecyclerViewItemPosition ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerview = (RecyclerView)findViewById(R.id.recyclerview1); RecyclerViewLayoutManager = new LinearLayoutManager(getApplicationContext()); recyclerview.setLayoutManager(RecyclerViewLayoutManager); SubjectNames = new ArrayList<>(); SubjectNames.add("ANDROID"); SubjectNames.add("PHP"); SubjectNames.add("BLOGGER"); SubjectNames.add("CSS"); SubjectNames.add("MATHS"); SubjectNames.add("ASP.NET"); SubjectNames.add("JAVA"); SubjectNames.add("C++"); SubjectNames.add("HTML"); SubjectNames.add("PHOTOSHOP"); RecyclerView.Adapter adapter = new RecyclerViewAdapter(SubjectNames); recyclerview.setAdapter(adapter); recyclerview.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { GestureDetector gestureDetector = new GestureDetector(MainActivity.this, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent motionEvent) { return true; } }); @Override public boolean onInterceptTouchEvent(RecyclerView Recyclerview, MotionEvent motionEvent) { ChildView = Recyclerview.findChildViewUnder(motionEvent.getX(), motionEvent.getY()); if(ChildView != null && gestureDetector.onTouchEvent(motionEvent)) { RecyclerViewItemPosition = Recyclerview.getChildAdapterPosition(ChildView); Toast.makeText(MainActivity.this, SubjectNames.get(RecyclerViewItemPosition), Toast.LENGTH_LONG).show(); } return false; } @Override public void onTouchEvent(RecyclerView Recyclerview, MotionEvent motionEvent) { } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }); } } |
و محاصل کار هم همانند زیر می شود.
این آموزش هم به پایان رسید.
موفق و موید باشید.
سلام
میخواستم بدونم میشه یه recycler view سفارشی درست کرد مثلا عکس و متن و چک باکس داشته باشه
بعد روی هر کدوم کلید کرد یه سری کارا انجام بده
مثلا روی عکس کلید کرد عکس و باز کنه
روی متن کلید کرد یه کار دیگه
سلام و درود بله امکان پذیر هست شما در بخش Adapter که میسازید برخی از اشیا find میشند می توانید در آن بخش برای هر شئی setOnClicListener تعریف کنید.
موفق باشید.
اگه بخوایم بصورت implements باشه و بیرون از onCreate دستورات رو بنویسیم باید چکار کنیم؟
از بالا implement مربوط به gesture را قرار بدید سپس مقدار this را برای متد addOnItemTouchListener قرار داده روی آن ALt Enter بزنید تا متد ها به صورت اتوماتیک implemnt شود.
موفق و پیروز باشید.
سلام استاد خسته نباشید سوالی داشتم خدمتتان
من یک ریسایکلر ویو ساختم و اداپتر هم براش تعریف کردم
من داخل هر ایتمم یک دکمه دارم که وقتی میزنم اون ایتم رنگش عوض میشه تا اینجای کار عمل میکنه ولی وقتی اسکرول میزنم میرم پایین تر ایتم های دیگه هم بعضیاشون رنگشون عوض شده همزمان هم به بالا حرکت میکنم اون ایتمم رنگش ثابت نمونده و مثل ایتم های دیگه ام شده تا اونجایی که فهمیدم پوزیشن همون ایتم با پوزیشن ایتم های جدید ست میشه و رنگشون عوض میشه
امیدوارم خوب مطرح کرده باشم سوالمو