-2

I want to convert Listview to RecyclerView in my app, I tried to convert code but stucked at getView method, can any one explain how to use this getView code in Recylcer view.

Adapter for ListView CardAdapter.java

public class CardAdapter extends ArrayAdapter<CardDataModel> {

    private Context context;
    List<CardDataModel> cards;
    SharedPreference sharedPreference;

    public CardAdapter(Context context, List<CardDataModel> cards) {
        super(context, R.layout.card_list_item, cards);
        this.context = context;
        this.cards = cards;
        sharedPreference = new SharedPreference();
    }

    private class ViewHolder {
        TextView CardNameTxt;
        TextView CardDescTxt;
        TextView CardPriceTxt;
        ImageView favoriteImg;
    }

    @Override
    public int getCount() {
        return cards.size();
    }

    @Override
    public CardDataModel getItem(int position) {
        return cards.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.card_list_item, null);
            holder = new ViewHolder();
            holder.CardNameTxt = (TextView) convertView
                    .findViewById(R.id.txt_crd_name);
            holder.CardDescTxt = (TextView) convertView
                    .findViewById(R.id.txt_crd_desc);
            holder.CardPriceTxt = (TextView) convertView
                    .findViewById(R.id.txt_crd_no);
            holder.favoriteImg = (ImageView) convertView
                    .findViewById(R.id.imgbtn_favorite);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        CardDataModel card = (CardDataModel) getItem(position);
        holder.CardNameTxt.setText(card.getName());
        holder.CardDescTxt.setText(card.getDescription());
        holder.CardPriceTxt.setText(card.getPrice() + " ");

        /*If a product exists in shared preferences then set heart_red drawable
         * and set a tag*/
        if (checkFavoriteItem(card)) {
            holder.favoriteImg.setImageResource(R.drawable.heart_red);
            holder.favoriteImg.setTag("red");
        } else {
            holder.favoriteImg.setImageResource(R.drawable.heart_grey);
            holder.favoriteImg.setTag("grey");
        }

        return convertView;
    }




    public boolean checkFavoriteItem(CardDataModel checkCard) {
        boolean check = false;
        List<CardDataModel> favorites = sharedPreference.getFavorites(context);
        if (favorites != null) {
            for (CardDataModel card : favorites) {
                if (card.equals(checkCard)) {
                    check = true;
                    break;
                }
            }
        }
        return check;
    }

    @Override
    public void add(CardDataModel card) {
        super.add(card);
        cards.add(card);
        notifyDataSetChanged();
    }

    @Override
    public void remove(CardDataModel card) {
        super.remove(card);
        cards.remove(card);
        notifyDataSetChanged();
    }
}

converted somecode like this in RecyclerView Adapter ... CardRvAdapter.java

public class CardRvAdapter extends RecyclerView.Adapter<CardRvAdapter.MyViewHolder> {


    private Context context;
    List<CardDataModel> cards;
    SharedPreference sharedPreference;

    public CardRvAdapter(Context context, List<CardDataModel> cards) {

        this.context = context;
        this.cards = cards;
        sharedPreference = new SharedPreference(); }

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

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

        // on create view holder code
        View view;
        LayoutInflater mInflater = LayoutInflater.from(context);
        view  = mInflater.inflate(R.layout.card_list_item, viewGroup,false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {

        //on bind view holder code
        myViewHolder.CardPriceTxt.setText(cards.get(i).getPrice());
        myViewHolder.CardNameTxt.setText(cards.get(i).getName());
        myViewHolder.CardDescTxt.setText(cards.get(i).getDescription());

        if (checkFavoriteItem(card)) {
           myViewHolder.favoriteImg.setImageResource(R.drawable.heart_red);
            myViewHolder.favoriteImg.setTag("red");
        } else {
            myViewHolder.favoriteImg.setImageResource(R.drawable.heart_grey);
            myViewHolder.favoriteImg.setTag("grey");
        } }

        // checking for favotites in shared preferences

        public boolean checkFavoriteItem(CardDataModel checkCard) {
        boolean check = false;
        List<CardDataModel> favorites = sharedPreference.getFavorites(context);
        if (favorites != null) {
            for (CardDataModel card : favorites) {
                if (card.equals(checkCard)) {
                    check = true;
                    break;
                }
            }
        }
        return check;
    }

    @Override
    public void add(CardDataModel card) {
        super.add(card);
        cards.add(card);
        notifyDataSetChanged();
    }

    @Override
    public void remove(CardDataModel card) {
        super.remove(card);
        cards.remove(card);
        notifyDataSetChanged();
    }


    public class MyViewHolder extends RecyclerView.ViewHolder {
        TextView CardNameTxt;
        TextView CardDescTxt;
        TextView CardPriceTxt;
        ImageView favoriteImg;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            this.CardDescTxt = (TextView) itemView.findViewById(R.id.txt_crd_desc);
            this.CardNameTxt = (TextView) itemView.findViewById(R.id.txt_crd_name);
            this.CardPriceTxt = (TextView) itemView.findViewById(R.id.txt_crd_no);
            this.favoriteImg = (ImageView) itemView.findViewById(R.id.imgbtn_favorite);
            }}}

The problem part..

 public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.card_list_item, null);
            holder = new ViewHolder();
            holder.CardNameTxt = (TextView) convertView
                    .findViewById(R.id.txt_crd_name);
            holder.CardDescTxt = (TextView) convertView
                    .findViewById(R.id.txt_crd_desc);
            holder.CardPriceTxt = (TextView) convertView
                    .findViewById(R.id.txt_crd_no);
            holder.favoriteImg = (ImageView) convertView
                    .findViewById(R.id.imgbtn_favorite);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        CardDataModel card = (CardDataModel) getItem(position);
        holder.CardNameTxt.setText(card.getName());
        holder.CardDescTxt.setText(card.getDescription());
        holder.CardPriceTxt.setText(card.getPrice() + " ");

        /*If a product exists in shared preferences then set heart_red drawable
         * and set a tag*/
        if (checkFavoriteItem(card)) {
            holder.favoriteImg.setImageResource(R.drawable.heart_red);
            holder.favoriteImg.setTag("red");
        } else {
            holder.favoriteImg.setImageResource(R.drawable.heart_grey);
            holder.favoriteImg.setTag("grey");
        }

        return convertView;
    }

How to modify this code and where to add this checkFavItem, add , and remove methods..suggest me , i am new to android development.

Amar
  • 3
  • 3
  • `getView` == `onCreateViewHolder` + `onBindViewHolder` – pskink Dec 16 '18 at 06:32
  • in `ListView` the method `getView()` both creates the view and binds data to that view, in `RecyclerView` it is done by those two methods – pskink Dec 16 '18 at 06:36
  • you dont need any tag, just copy the code starting from `CardDataModel card = (CardDataModel) getItem(position);` to `onBindViewHolder` method – pskink Dec 16 '18 at 07:06

1 Answers1

1

Finishing RecyclerView Code

// specify the row layout file and click for each row
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(listItemLayout, parent, false);
    ViewHolder myViewHolder = new ViewHolder(view);
    return myViewHolder;
}

// load data in each row element
@Override
public void onBindViewHolder(final ViewHolder holder, final int listPosition) {
    TextView item = holder.item;
    item.setText(itemList.get(listPosition).getName());
}
Sharan
  • 1,055
  • 3
  • 21
  • 38
  • Well, In this case just hold all the views in the view holder. Then check for /*If a product exists in shared preferences then set heart_red drawable * and set a tag*/ – Sharan Dec 16 '18 at 07:04
  • Do you want a kotlin version of recyclerview which will be optimized and of less boilerplate. – Sharan Dec 16 '18 at 07:05
  • 1
    Please post a question with code snippet and Logcat of the following error, so that I can recreate the error and also if not I can help you with some tricks. – Sharan Dec 16 '18 at 07:46
  • The Question is removed. – Sharan Dec 16 '18 at 09:56
  • I'll look into it, just wait for sometime. – Sharan Dec 16 '18 at 10:09
  • @Amar Someone as solved it, look at this repository that was mentioned in the comments. You'll get all the answers. https://github.com/MFaisalHyder/RecylerView-And-SharedPreferences/blob/master/src/com/faisal/easyprounounce/adapter/RecyclerAdapter.java – Sharan Dec 16 '18 at 10:16
  • Well, then you should ask more questions on StackOverflow. That's the most recommended approach. – Sharan Dec 16 '18 at 10:44
  • Be precise and research more on the concept next time. Don't worry initially android might seem overwhelming but it's just a phase and yes, Welcome to the community. – Sharan Dec 16 '18 at 11:14