Farzad Sarseifi

ساخت RecyclerView انتخابی

1 ارسال در این موضوع قرار دارد

device-2015-08-28-121517.png.029690f80fbc149afa79ed79a2d50692.png

در این آموزش  قصد داریم یک لیست از اطلاعات را با استفاده از RecyclerView ایجاد کنیم که سطرهای قابلیت انتخاب و تغییر شدن را داشته باشند

 

 

Gradle

compile 'com.android.support:recyclerview-v7:23.0.0'

activity_recycle_view_main.xml

 <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=".RecycleViewMainActivity">  
   <android.support.v7.widget.RecyclerView  
     android:id="@+id/recycler_view"  
     android:layout_width="match_parent"  
     android:layout_height="match_parent"  
     android:scrollbars="vertical" />  
 </RelativeLayout>  

list_item_row.xml

<?xml version="1.0" encoding="utf-8"?>  
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
   android:id="@+id/list_row"  
   android:layout_width="match_parent"  
   android:layout_height="wrap_content"  
   android:clickable="true"  
   android:orientation="vertical">  
   <LinearLayout  
     android:id="@+id/linear"  
     android:layout_width="match_parent"  
     android:layout_height="wrap_content"  
     android:orientation="horizontal">  
     <ImageView  
       android:id="@+id/plantImageView"  
       android:layout_width="100dp"  
       android:layout_height="100dp"  
       android:scaleType="fitXY"  
       android:src="@mipmap/ic_launcher" />  
     <LinearLayout  
       android:id="@+id/innerLayout"  
       android:layout_width="0dp"  
       android:layout_height="wrap_content"  
       android:layout_margin="5dp"  
       android:layout_weight="0.9"  
       android:orientation="vertical">  
       <TextView  
         android:id="@+id/personNameTextView"  
         android:layout_width="wrap_content"  
         android:layout_height="wrap_content"  
         android:layout_marginLeft="5dp"  
         android:fontFamily="sans-serif-light"  
         android:singleLine="true"  
         android:textColor="#5B5B5B"  
         android:textSize="16dp"  
         android:textStyle="bold" />  
       <TextView  
         android:id="@+id/personDsgTextView"  
         android:layout_width="wrap_content"  
         android:layout_height="wrap_content"  
         android:layout_marginLeft="5dp"  
         android:fontFamily="sans-serif-light"  
         android:singleLine="true"  
         android:textAppearance="?android:attr/textAppearanceSmall"  
         android:textColor="#787878" />  
       <TextView  
         android:id="@+id/personAddTextView"  
         android:layout_width="wrap_content"  
         android:layout_height="wrap_content"  
         android:layout_marginLeft="5dp"  
         android:fontFamily="sans-serif-light"  
         android:singleLine="true"  
         android:textAppearance="?android:attr/textAppearanceSmall"  
         android:textColor="#787878" />  
     </LinearLayout>  
   </LinearLayout>  
   <View  
     android:layout_width="match_parent"  
     android:layout_height="1dp"  
     android:layout_below="@+id/linear"  
     android:background="#787878" />  
 </RelativeLayout>  

RecycleViewMainActivity.java

 import android.os.Bundle;  
 import android.support.v7.app.AppCompatActivity;  
 import android.support.v7.widget.LinearLayoutManager;  
 import android.support.v7.widget.RecyclerView;  
 import android.view.View;  
 import java.util.ArrayList;  
 public class RecycleViewMainActivity extends AppCompatActivity {  
   private ArrayList<Person> mPersonList;  
   private RecyclerView mRecyclerView;  
   private CustomAdapter mAdapter;  
   private RecyclerView.LayoutManager mLayoutManager;  
   @Override  
   protected void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState);  
     setContentView(R.layout.activity_recycle_view_main);  
     mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);  
     // use this setting to improve performance if you know that changes  
     // in content do not change the layout size of the RecyclerView  
     mRecyclerView.setHasFixedSize(true);  
     // use a linear layout manager  
     mLayoutManager = new LinearLayoutManager(getApplicationContext());  
     mRecyclerView.setLayoutManager(mLayoutManager);  
     mRecyclerView.addOnItemTouchListener(  
         new RecyclerItemClickListener(getApplicationContext(), new RecyclerItemClickListener.OnItemClickListener() {  
           @Override  
           public void onItemClick(View view, int position) {  
             try {  
               mAdapter.setSelected(position);  
             } catch (Exception e) {  
               e.printStackTrace();  
             }  
           }  
         })  
     );  
     setupPersonList();  
   }  
   private void setupPersonList() {  
     mPersonList = new ArrayList<Person>();  
     mPersonList.clear();  
     for (int i = 0; i < 25; i++) {  
       Person person = new Person("Person " + i, "Desgination " + i, "Address " + i);  
       mPersonList.add(person);  
     }  
     mAdapter = new CustomAdapter(mPersonList, this);  
     mRecyclerView.setAdapter(mAdapter);  
   }  
 }  

RecyclerItemClickListener.java

import android.content.Context;  
 import android.support.v7.widget.RecyclerView;  
 import android.view.GestureDetector;  
 import android.view.MotionEvent;  
 import android.view.View;  
 public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {  
   private OnItemClickListener mListener;  
   public interface OnItemClickListener {  
     public void onItemClick(View view, int position);  
   }  
   GestureDetector mGestureDetector;  
   public RecyclerItemClickListener(Context context, OnItemClickListener listener) {  
     mListener = listener;  
     mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {  
       @Override public boolean onSingleTapUp(MotionEvent e) {  
         return true;  
       }  
     });  
   }  
   @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {  
     View childView = view.findChildViewUnder(e.getX(), e.getY());  
     if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {  
       mListener.onItemClick(childView, view.getChildPosition(childView));  
       return true;  
     }  
     return false;  
   }  
   @Override  
   public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {  
   }  
   @Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { }  
 }  

CustomAdapter.java

import android.content.Context;  
 import android.content.SharedPreferences;  
 import android.graphics.Color;  
 import android.support.v7.widget.RecyclerView;  
 import android.util.Log;  
 import android.view.LayoutInflater;  
 import android.view.View;  
 import android.view.ViewGroup;  
 import android.widget.RelativeLayout;  
 import android.widget.TextView;  
 import java.util.ArrayList;  
 public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {  
   private ArrayList<Person> mPersonList;  
   private SharedPreferences mPref;  
   private SharedPreferences.Editor mEditor;  
   // Provide a reference to the views for each data item  
   // Complex data items may need more than one view per item, and  
   // you provide access to all the views for a data item in a view holder  
   public class ViewHolder extends RecyclerView.ViewHolder {  
     // each data item is just a string in this case  
     TextView personNameTextView, personAddTextView, personDsgTextView;  
     RelativeLayout list_row;  
     public ViewHolder(View v) {  
       super(v);  
       personNameTextView = (TextView) v.findViewById(R.id.personNameTextView);  
       personAddTextView = (TextView) v.findViewById(R.id.personAddTextView);  
       personDsgTextView = (TextView) v.findViewById(R.id.personDsgTextView);  
       list_row = (RelativeLayout) v.findViewById(R.id.list_row);  
     }  
   }  
   public void add(int position, Person item) {  
     mPersonList.add(position, item);  
     notifyItemInserted(position);  
   }  
   public void remove(String item) {  
     int position = mPersonList.indexOf(item);  
     mPersonList.remove(position);  
     notifyItemRemoved(position);  
   }  
   // Provide a suitable constructor (depends on the kind of dataset)  
   public CustomAdapter(ArrayList<Person> personList, Context context) {  
     mPersonList = personList;  
     mPref = context.getSharedPreferences("person", Context.MODE_PRIVATE);  
     mEditor = mPref.edit();  
   }  
   // Create new views (invoked by the layout manager)  
   @Override  
   public CustomAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,  
                             int viewType) {  
     // create a new view  
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_row, parent, false);  
     // set the view's size, margins, paddings and layout parameters  
     ViewHolder vh = new ViewHolder(v);  
     return vh;  
   }  
   // Replace the contents of a view (invoked by the layout manager)  
   @Override  
   public void onBindViewHolder(ViewHolder holder, int position) {  
     // - get element from your dataset at this position  
     // - replace the contents of the view with that element  
     holder.personNameTextView.setText(mPersonList.get(position).getPersonName());  
     holder.personAddTextView.setText(mPersonList.get(position).getPersonAdd());  
     holder.personDsgTextView.setText(mPersonList.get(position).getPersonDsg());  
     Log.e("selection", "" + mPersonList.get(position).isSelected());  
     if (mPersonList.get(position).isSelected()) {  
       holder.list_row.setBackgroundColor(Color.parseColor("#d5d5d5"));  
     } else {  
       holder.list_row.setBackgroundColor(Color.TRANSPARENT);  
     }  
   }  
   public void setSelected(int pos) {
        try {
            if (mPersonList.size() > 1) {
                mPersonList.get(mPref.getInt("position", 0)).setSelected(false);
                mEditor.putInt("position", pos);
                mEditor.commit();
            }
            mPersonList.get(pos).setSelected(true);
            notifyDataSetChanged();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
   // Return the size of your dataset (invoked by the layout manager)  
   @Override  
   public int getItemCount() {  
     return mPersonList.size();  
   }  
 }  

Person.java

public class Person {  
   String personName;  
   String personAdd;  
   String personDsg;  
   boolean selected;  
   Person(String name, String dsg, String add) {  
     this.personName = name;  
     this.personAdd = add;  
     this.personDsg = dsg;  
   }  
   public boolean isSelected() {  
     return selected;  
   }  
   public void setSelected(boolean selected) {  
     this.selected = selected;  
   }  
   public String getPersonDsg() {  
     return personDsg;  
   }  
   public void setPersonDsg(String personDsg) {  
     this.personDsg = personDsg;  
   }  
   public String getPersonAdd() {  
     return personAdd;  
   }  
   public void setPersonAdd(String personAdd) {  
     this.personAdd = personAdd;  
   }  
   public String getPersonName() {  
     return personName;  
   }  
   public void setPersonName(String personName) {  
     this.personName = personName;  
   }  
 }  

 

 

1 کاربر پسند دیده است

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال نظر یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید نظر ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در انجمن ما ثبت نام کنید. عضویت خیلی ساده است !


ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید


ورود به حساب کاربری

  • مطالب مشابه

    • توسط sobhan
      سلام
      من واسه فیلتربندی کتاب هام و دسته بندی کتاب هام از 2تا ریسایکلرویوو استفاده کردم یعنی یکی برای دسته ها و یکی هم برای خود کتاب ها
      و واسه اینکه روی هرکدوم از دسته بندی ها که کلیک شد کتاب های اون دسته رو نشون بده از Broadcast استفاده کردم یعنی مقدار رو از آداپتر دسته بندی ها میگیرم و میارم توی آداپتر کتاب ها
      و بعد از اینکه یه دسته رو انتخاب کرد اون ایتم هایی رو که جزو اون دسته هستند visible و بقیه gone شند
      حالا مشکل من اینجاست که وقتی توی یک دسته بندی هستم و چندتا کتاب رو اضافه میکنم، وقتی میرم توی یه دسته بندی دیگه و دوباره برمیگردم توی دسته بندی قبلی، تعدادش رو صفر نشون میده ☹️
      البته وقتی میزنم مشاهده سبدخرید (یعنی مرحله بعد)، همه چیز درسته یعنی کتاب ها و تعدادشون درست نشون میده
      این رو هم اضافه کنم که دیتاهارو از وبسرویس میگیرم و میریزم توی دیتابیس اپ و بعد از دیتابیس توی ریسایکلرویوو نمایشش میدم
      واسه هرکدوم از کتاب هایی که تعدادشون رو هم زیاد و کم میکنم توی دیتابیسم ذخیره میشه
      میشه راهش رو بهم بگین☹️
    • توسط MaHdI-09
      سلام.من یک ریسایکلرویو دارم که میخوام وقتی دیتا توش اضافه کردم.بره به آخرین position  ریسایکلرویو.

      لطفا درصورت پاسخ بفرمایید در کدام کلاس باید کد ها رو بنویسم.

      با سپاس فراوان
    • توسط Omid Zakeri
      بعضی از دوستان برای انجام onLongClick و onClick در recyclerView دچار مشکل میشن.قصد من در این آموزش انجام این اعمال در recyclerView  هستش.
      برای این کار ابتدا باید یک کلاس جداگانه بنویسیم به صورت زیر:
      public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { private OnItemClickListener mListener; private OnItemLongClickListener mLongListener; public interface OnItemClickListener { public void onItemClick(View view, int position); } public interface OnItemLongClickListener { public void onItemClick(View view, int position); } GestureDetector mGestureDetector; public RecyclerItemClickListener(Context context, OnItemClickListener listener) { mListener = listener; mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return true; } }); } public RecyclerItemClickListener(Context context, OnItemLongClickListener listener) { mLongListener = listener; mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return true; } }); } @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { View childView = view.findChildViewUnder(e.getX(), e.getY()); if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { mListener.onItemClick(childView, view.getChildAdapterPosition(childView)); } return false; } @Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }  
       
      بعد از اضافه کردن کلاس بالا حالا باید ازش استفاده کنیم به صورت زیر :
       
      متد onLongClick:
      recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), attachFileRecyclerView, new RecyclerTouchListener.ClickListener() { @Override public void onClick(View view, int position) { } @Override public void onLongClick(View view, final int position) { . . . } }));  
       
      متد onClick:
      recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getApplicationContext(), new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { . . . } }));  
    • توسط ali5250
      سلام ، من برای ساخت Endless RecyclerView طبق این اموزش :
      https://stackoverflow.com/questions/37004131/implementing-endless-recyclerview
      به مشکل برخورم ، مشکلی که دارم اینه که نمیدونم ادپتر رو چطوری باید ست کنم و اطلاعات هر سطر رو بهش بدم و بصورت کلی متوجه نشدم چطور باید از این کد استفاده کنم ممنون میشم راهنمایی کنید .
    • توسط Omid Zakeri
      RecyclerViewFastScroller یک ویجت است که می توان از آن برای پیمایش سریع استفاده کرد.

       
      RecyclerViewFastScroller-master.zip

  • دوره آموزشی اندروید آموزش ویدئویی اندروید آموزش برنامه نویسی اندروید اندروید کاپ دوره آنلاین اندروید کتاب های آموزشی اندروید بسته آموزشی اندروید دوره برنامه نویسی اندروید آموزش Kotlin آموزش برنامه نویسی ios مهارت های فروش
    آموزش برنامه نویسی اندروید
  • فایل