انشاء Adapter للـ PagedList

Mohammad Laifمنذ 5 سنوات

بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته

في هذا الدرس سنتعلم كيفية انشاء Adpater من نوع PagedList و ايضاً طريقة عمل مقارن Comparator ليساعده في عرض العناصر, حتى نستطيع استخدامه مع الـ Paging في الدرس القادم.

 

ماهو الـ PagedList Adapter؟

ادابتر مخصص للتعامل مع الـ PagedList ليعرض نتائجها في الـ RecyclerView.

 

ماذا سننشئ؟

/uploads/2018/September/k6sCkjASSOcYpYMoAtCDn1kapO6ATr6nhIAg08Gt.png

  • انشاء Comparator ليساعد الـ PagedListAdapter في عمل المقارنه بين العناصر المراد عرضها.
  • كلاس من نوع PagedListAdapter.

 

انشاء Comparator للعناصر CardEntity

نقوم بانشاء مقارن Comparator ليساعد الـ PagedListAdapter في مقارنة العناصر وتحديد ماسوف يقوم بعرضه في الـ ReyclerView, سوف نضعه في كلاس الـ CardEntity:

    /**
     * A comparator for our CardListAdapter (because it is required for PagedListAdapter type to use paging).
     */
    public static DiffUtil.ItemCallback<CardEntity> DIFF_CALLBACK = new DiffUtil.ItemCallback<CardEntity>() {
        @Override
        public boolean areItemsTheSame(CardEntity oldItem, CardEntity newItem) {
            return oldItem.getId() == newItem.getId();
        }

        @Override
        public boolean areContentsTheSame(CardEntity oldItem, CardEntity newItem) {
            return oldItem.equals(newItem);
        }
    };

 

وايضاً نقوم بعمل Override للدالة equals ونجري عليها بعض التعديلات:

    // We override this method to our comparator
    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        } else {
            CardEntity cardEntity = (CardEntity) obj;
            return cardEntity.getId() == this.getId() && cardEntity.getFrontSide() == this.getFrontSide();
        }
    }

 

لتصبح كلاس الـ CardEntity كاملة بهذا الشكل:

package com.mzdhr.flashcards.database.entity;


import android.arch.persistence.room.ColumnInfo;
import android.arch.persistence.room.Entity;
import android.arch.persistence.room.ForeignKey;
import android.arch.persistence.room.Ignore;
import android.arch.persistence.room.Index;
import android.arch.persistence.room.PrimaryKey;
import android.support.v7.util.DiffUtil;

import java.util.Date;

@Entity(
        tableName = "cards",
        foreignKeys = {
                @ForeignKey(entity = SubjectEntity.class,
                        parentColumns = "subject_id",
                        childColumns = "card_parent_id",
                        onDelete = ForeignKey.CASCADE)},
        indices = {@Index(value = "card_parent_id")}
)
public class CardEntity {

    /**
     * A comparator for our CardListAdapter (because it is required for PagedListAdapter type to use paging).
     */
    public static DiffUtil.ItemCallback<CardEntity> DIFF_CALLBACK = new DiffUtil.ItemCallback<CardEntity>() {
        @Override
        public boolean areItemsTheSame(CardEntity oldItem, CardEntity newItem) {
            return oldItem.getId() == newItem.getId();
        }

        @Override
        public boolean areContentsTheSame(CardEntity oldItem, CardEntity newItem) {
            return oldItem.equals(newItem);
        }
    };

    // We override this method to our comparator
    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        } else {
            CardEntity cardEntity = (CardEntity) obj;
            return cardEntity.getId() == this.getId() && cardEntity.getFrontSide() == this.getFrontSide();
        }
    }


    /**
     * Fields
     */
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "card_id")
    private int mId;
    @ColumnInfo(name = "card_parent_id")
    private int mParentId;
    private String mFrontSide;
    private String mBackSide;
    private Date mDate;

    // Room Construction
    public CardEntity(int id, String frontSide, String backSide, int parentId, Date date) {
        mId = id;
        mFrontSide = frontSide;
        mBackSide = backSide;
        mParentId = parentId;
        mDate = date;
    }

    // Our Construction
    @Ignore
    public CardEntity(String frontSide, String backSide, int parentId, Date date) {
        mFrontSide = frontSide;
        mBackSide = backSide;
        mParentId = parentId;
        mDate = date;
    }

    // Getter and Setter pattern required for Room.
    public int getId() {
        return mId;
    }

    public void setId(int id) {
        mId = id;
    }

    public int getParentId() {
        return mParentId;
    }

    public void setParentId(int parentId) {
        mParentId = parentId;
    }

    public String getFrontSide() {
        return mFrontSide;
    }

    public void setFrontSide(String frontSide) {
        mFrontSide = frontSide;
    }

    public String getBackSide() {
        return mBackSide;
    }

    public void setBackSide(String backSide) {
        mBackSide = backSide;
    }

    public Date getDate() {
        return mDate;
    }

    public void setDate(Date date) {
        mDate = date;
    }
}

 

 

انشاء Adpater خاصة للـ Paging

ننشئ كلاس جديدة ونجعلها تعمل extend لكلاس الـ PagedListAdapter:

public class PracticeListAdapter extends PagedListAdapter<CardEntity, PracticeListAdapter.CardViewHolder>{}

الـ Generic لهذا الادابتر تكون كلاسنا CardEntity و كلاس من نوع ViewHolder.

 

نقوم بوضع الـ Comparator في الـ Constructor الخاص بالادابر:

public class CardListAdapter extends PagedListAdapter<CardEntity, CardListAdapter.CardViewHolder>{

    private final LayoutInflater mInflater;
    private List<CardEntity> mCardEntities;

    public CardListAdapter(Context context) {
        super(CardEntity.DIFF_CALLBACK);
        mInflater = LayoutInflater.from(context);
    }

 

وتصبح كلاس الـ CardListAdapter كاملة على هذا الشكل:

package com.mzdhr.flashcards.adapter;

import android.arch.paging.PagedListAdapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.mzdhr.flashcards.R;
import com.mzdhr.flashcards.database.entity.CardEntity;

import java.util.List;

public class CardListAdapter extends PagedListAdapter<CardEntity, CardListAdapter.CardViewHolder>{

    private final LayoutInflater mInflater;
    private List<CardEntity> mCardEntities;

    public CardListAdapter(Context context) {
        super(CardEntity.DIFF_CALLBACK);
        mInflater = LayoutInflater.from(context);
    }

    @NonNull
    @Override
    public CardListAdapter.CardViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = mInflater.inflate(R.layout.list_item_card, parent, false);
        return new CardViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull CardListAdapter.CardViewHolder holder, int position) {
        if (mCardEntities != null) {
            CardEntity currentCardEntity = mCardEntities.get(position);
            holder.cardFrontTextView.setText(currentCardEntity.getFrontSide());
            holder.cardBackTextView.setText(currentCardEntity.getBackSide());
        }
    }

    public void setCardEntities(List<CardEntity> cardEntities) {
        mCardEntities = cardEntities;
        notifyDataSetChanged();
    }

    @Override
    public int getItemCount() {
        if (mCardEntities != null) {
            return mCardEntities.size();
        } else {
            return 0;
        }
    }
    
    class CardViewHolder extends RecyclerView.ViewHolder {
        private final TextView cardFrontTextView;
        private final TextView cardBackTextView;

        public CardViewHolder(View itemView) {
            super(itemView);
            cardFrontTextView = itemView.findViewById(R.id.card_front_textView);
            cardBackTextView = itemView.findViewById(R.id.card_back_textView);

        }
    }

}

 

في الدرس القادم سنرى كيفية استخدامة مع الـ RecyclerView.

 

نهاية الدرس

فضلاً اذا اعجبك الدرس لاتنسى الضغظ على زر اعجبني ولنشر الفائدة قم بمشاركته مع من تحب. ولاتنسى تتبع الدرس حتى تطلع على التغييرات والتحديثات المتعلقه به مستقبلاً. وكذلك الامر بالنسبة للدورة من تتبع و اعجاب ومشاركة حتى يصلك جديد الدروس المتعلقه بها.

 

المصادر:

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !