عرض اكثر من layout داخل الrecyclerview داخل الادبتر

 

عرض اكثر من layout داخل الrecyclerview داخل الادبتر

عرض اكثر من layout داخل الrecyclerview داخل الادبتر


في استخدامك للrecyclerview ترغب احيانا بتغيير النمط قليلا على سبيل المثال تريد ظهور مربعين بجانب بعضهم البعض ولكن بعد كل 4 مربعات صغيره يظهر مربع كامل كبير وهكذا وقد يصعب الامر لدى الاغلب منكم ولكن كل العمل يكون داخل ملف الadapter وفي هذا المقال سوف نشارك معكم كيف تستطيع ان تقوم بتغيير شكل الitem داخل recycerview واحد وهذا الامر من الامور التي عليك معرفتها والتدرب عليها بشكل جيد لكي تحسن من مستواك البرمجي في التعامل مع تطبيقات الاندرويد بشكل كبير .


اصبحت تقنية تطوير تطبيقات الجوال والهواتف الذكيه من اهم ال technology المستخدمه في الفتره الحاليه والتي عليها طلب كبير جدا من الاشخاص الذين يريدون تعلمها لاصدار التطبيقات الخاصه بهم وتطويرها بنفسهم دون الحاجه الى الى الاستعانه بمطور android او mobile application developer وهو الشخص المتخصص في تطوير التطبيقات ، وايضا هذة المهاره اصبحت مصدر دخل لكثير من الاشخاص .


تعتمد عمليات تطوير تطبيقات android على لغتي java و kotlin وهذا للتطبيقات ال native وهي التطوير التي تعمل على منصة واحده ويكون ال performance الخاص بها افضل من غيره على عكس التقنيات الحديثة والتي تسمى Cross platform مثل react native و flutter والتي تجعلك بكود واحد تشغيل التطبيقات على أكثر من منصة بنفس الكود ، ويوجد في موقعنا شروحات flutter ايضا .


إنشاء الشكل الذي ترغب بتقسيمه في Android Studio


هذا هو الشكل الاول الذي سوف نعمل على تنفيذة وهو بكل بساطة عباره عن مربع مستطيع سوف نقوم بتقسيمة الى جزئين .


إنشاء الشكل الذي ترغب بتقسيمه في Android Studio

red design.xml



<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_margin="10dp"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <androidx.cardview.widget.CardView
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:cardCornerRadius="10dp"
        android:backgroundTint="#E91E63"
        android:layout_width="match_parent"
        android:layout_height="150dp" >

        <TextView
            android:id="@+id/text1"
            android:text="Welcom"
            android:layout_gravity="center"
            android:padding="15dp"
            android:textSize="22sp"
            android:textStyle="bold"
            android:textColor="#fff"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </androidx.cardview.widget.CardView>

</androidx.constraintlayout.widget.ConstraintLayout>


إنشاء الشكل الثاني الذي نريد ادراجه مع الشكل الاول في نفس الAdapter


إنشاء الشكل الثاني الذي نريد ادراجه مع الشكل الاول في نفس الAdapter


في هذا الجزء سوف نقوم بعمل layout اخر وهو تقريبا نفس الشكل الاول ويحتوي على نفس الid الخاص به 


blue design.xml



<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <androidx.cardview.widget.CardView
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:cardCornerRadius="10dp"
        android:backgroundTint="#2196F3"
        android:layout_width="match_parent"
        android:layout_height="150dp" >

        <TextView
            android:id="@+id/text1"
            android:text="Hello"
            android:layout_gravity="center"
            android:padding="15dp"
            android:textSize="22sp"
            android:textStyle="bold"
            android:textColor="#fff"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </androidx.cardview.widget.CardView>

</androidx.constraintlayout.widget.ConstraintLayout>


الكلاس الذي يحمل البيانات


الكلاس الذي يحمل البيانات

في هذا الجزء سوف نقوم بعمل كلاس الداتا ويكون String لان هذا النوع فقط الذي نريد تغييره .


Data Class



public class DataTest {
    String text;

    public DataTest(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}


التعديل على كلاس الAdpter


التعديل على كلاس الAdpter


في هذا الكلاس سوف نقوم بالتعديل على onCreateViewHolder ونقوم ايضا بعمل methode خارجية باسم getItemViewType وتكون هذة الميثود مسؤوله عن ارجاع الشكل وهنا اذا كان الشكل رقم 5 ارجع الشكل الثاني واذا لم يكن 5 ارجع الشكل الاول وسوف نقوم بتقسيم الشكل الاول الى جزئين في الMain في داخل onCreateViewHolder سوف نقوم بإرجاع الاشكال وتعريف كل شكل لدينا نريد ارجاعه .


Adapter.class



public class AdapterTest extends RecyclerView.Adapter<AdapterTest.Holder> {
    ArrayList<DataTest> arrayList;
    Context context;

    public AdapterTest(ArrayList<DataTest> arrayList, Context context) {
        this.arrayList = arrayList;
        this.context = context;
    }

    @Override
    public int getItemViewType(int position) {
        if ((position+1) % 5 * 2 == 0) {
            return 1;
        } else {
            return 2;
        }

    }

    @NonNull
    @Override
    public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view;
        if (viewType == 2 ) {
            view = LayoutInflater.from(context).inflate(R.layout.recycler_double , parent , false);
        } else {
            view = LayoutInflater.from(context).inflate(R.layout.recycler_single , parent , false);

        }
        return new Holder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull Holder holder, int position) {
        final DataTest person = arrayList.get(position);
        holder.textView.setText(person.getText());

    }


    @Override
    public int getItemCount() {
        return arrayList.size();
    }

    class Holder extends RecyclerView.ViewHolder {
        TextView textView;
        public Holder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.text1);
        }
    }
}


الكود المستخدم داخل MainActivity


في هذا الكود سوف نقوم بإرجاع كل المتغيرات السابقة وايضا عرض المتغيرات بالشكل الذي نرغب به وكل هذا يكون عن طريق GridLayoutManager اذا كنا نريد تقسيم الشكل لاكثر من جزء او ارجاع جزء واحد فوق وهنا قمنا بعمل الكود بداحل setSpanSizeLookup وبداخل الreturn نرجع القيم .


الكود المستخدم داخل MainActivity


MainActivity.class



public class TestActivity extends AppCompatActivity {
    AdapterTest adapter;
    ArrayList<DataTest> list;
    RecyclerView recyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        recyclerView = findViewById(R.id.recyclertest);
        list = new ArrayList<>();

        list.add(new DataTest("Gee"));
        list.add(new DataTest("Coders"));
        list.add(new DataTest("coder"));
        list.add(new DataTest("Man"));
        list.add(new DataTest("Speed"));
        list.add(new DataTest("Java"));
        list.add(new DataTest("Dart"));
        list.add(new DataTest("Python"));
        list.add(new DataTest("Python"));
        list.add(new DataTest("Python"));
        list.add(new DataTest("Python"));
        list.add(new DataTest("Python"));

        adapter = new AdapterTest(list , this);
        GridLayoutManager manager = new GridLayoutManager(this,2);
        manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                if (( position + 1 ) % 5 * 2 == 0) {
                    return 2;
                } else {
                    return 1;
                }
            }
        });
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(manager);
    }
}

فيديو الشرح


تعليقات