3

I'm trying to show a list of data with RecyclerView and add an AdMob after 3 data showed. I have followed this stackoverflow Q&A because it's almost the same as my code but I'm using Retrofit.

But my result is just showing test AdMob rows only... It's not show my data's name String.

This is my MainActivity:

public class Nilai extends AppCompatActivity implements NilaiView {

    RecyclerView recyclerView;
    SwipeRefreshLayout swipeRefresh;

    NilaiPresenter presenter;
    RecyclerViewAdopter adapter;
    List<modelNilai> score;

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

        MobileAds.initialize(this, "ID_APP");

        recyclerView = findViewById(R.id.recyclerView);
        swipeRefresh = findViewById(R.id.swipe_refresh);

        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        presenter = new NilaiPresenter(this);
        presenter.getNilai();

        swipeRefresh.setOnRefreshListener(
                () -> presenter.getNilai()
        );

    }

    @Override
    public void showLoading() {
        swipeRefresh.setRefreshing(true);
    }

    @Override
    public void hideLoading() {
        swipeRefresh.setRefreshing(false);
    }

    @Override
    public void onGetNilai(List<modelNilai> scores) {
        adapter = new RecyclerViewAdopter(Nilai.this, scores);
        adapter.notifyDataSetChanged();
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(adapter);

        score = scores;

        for (int i = 0; i <= scores.size(); i += 3)
        {
            modelNilai myString2 = new modelNilai();
            myString.setId(i);
            scores.add(i,myString);
        }

    }

}

My Adapter:

public class RecyclerViewAdopter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

    private Context mContext;
    private List<modelNilai> mList;

    public RecyclerViewAdopter(Context mContext, List<modelNilai> mList) {
        this.mList = mList;
        this.mContext = mContext;
    }

    public static class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView name;
        public MyViewHolder(View view) {
            super(view);
            name = view.findViewById(R.id.namaSoal);
        }
    }

    public static class ViewHolderAdMob extends RecyclerView.ViewHolder {
        public AdView mAdView;
        public ViewHolderAdMob(View view) {
            super(view);
            mAdView = view.findViewById(R.id.adView);

            AdRequest adRequest = new AdRequest.Builder()
                    .addTestDevice("CEE26DC1A5BBF0E603B08A5460483046")
                    .build();
            mAdView.loadAd(adRequest);
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        RecyclerView.ViewHolder viewHolder = null;
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        switch(viewType){
            case 1:
            {
                View v = inflater.inflate(R.layout.list_nilai_ad, parent, false);
                viewHolder = new MyViewHolder(v);
                break;
            }
            case 2:
            default:
            {
                View v = inflater.inflate(R.layout.banner_ad_row, parent, false);
                viewHolder = new ViewHolderAdMob(v);
                break;
            }
        }
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {

        modelNilai model = mList.get(holder.getAdapterPosition());

        switch(holder.getItemViewType()){
            case 1:{
                MyViewHolder viewHolder = (MyViewHolder) holder;
                viewHolder.name.setText(model.getName());
                break;
            }
            case 2:{
                break;
            }
        }
    }

    @Override
    public int getItemViewType(int position)
    {
        return mList.get(position).getId();
    }

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

My presenter:

public class NilaiPresenter {
    private NilaiView view;

    public NilaiPresenter(NilaiView view) {
        this.view = view;
    }

    void getNilai() {
        view.showLoading();

        ApiInterface apiInterface = ApiClient.getApiClient().create(ApiInterface.class);
        Call<List<modelNilai>> call = apiInterface.getNilai();
        call.enqueue(new Callback<List<modelNilai>>() {
            @Override
            public void onResponse(@NonNull Call<List<modelNilai>> call, @NonNull Response<List<modelNilai>> response) {
                view.hideLoading();
                if (response.isSuccessful() && response.body() != null) {
                    view.onGetNilai(response.body());
                }

            }

            @Override
            public void onFailure(@NonNull Call<List<modelNilai>> call, @NonNull Throwable t) {
                view.hideLoading();
                view.onRequestError(t.getLocalizedMessage());

            }
        });
    }
}

My model class:

public class modelNilai {
    @Expose
    @SerializedName("id") private int id_nilai;
    @Expose
    @SerializedName("name") private String name;

    public int getId() {
        return id;
    }    
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

And My view interface:

public interface NilaiView {
    void showLoading();
    void hideLoading();
    void onGetNilai(List<modelNilai> scores);
}

Result on phone:

screenshot

It should show something like 3 rows of name and 1 row of Admob, and repeat that again per 4 rows.

hata
  • 11,633
  • 6
  • 46
  • 69
Rendi Chs
  • 45
  • 9

1 Answers1

2

Parhaps, the getItemViewType() method should be like this:

@Override
public int getItemViewType(int position)
{
    return (position + 1) % 4 == 0 ? 2 : 1;
}

You also have to modify the getItemCount() method. Because it should return the count of all of your mList rows and PLUS of your Admob rows.

@Override
public int getItemCount() {
    return mList.size() + mList.size / 4;
}

In addition to that the onBindViewHolder method is affected:

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
    modelNilai model = mList.get(holder.getAdapterPosition() - holder.getAdapterPosition() / 4);

    if ((position + 1) % 4 != 0) {
        MyViewHolder viewHolder = (MyViewHolder) holder;
        viewHolder.name.setText(model.getName());
    }
}
hata
  • 11,633
  • 6
  • 46
  • 69
  • its working,, but should i use `for (int i = 0; i <= scores.size(); i +=3)` on activity.. its look annoying for me. – Rendi Chs May 09 '20 at 06:40
  • i check total row on my database is 5 rows. but i got only 4 rows. can u make it auto ? not manual. – Rendi Chs May 09 '20 at 06:50
  • @RendiChs I didn't notice that (about MainActivity). Ok, wait... – hata May 09 '20 at 06:51
  • @RendiChs Ok. If your current problem has been cleared, please accept my answer to finish this Q&A. If there is another problem related your program, you can post a new question. – hata May 09 '20 at 07:01
  • Sorry,, but ur answer still not perfect sir.. example i got 5 rows.. it show all, but rows on 4, its REPLACE to AdMob. can u fix it ? – Rendi Chs May 09 '20 at 07:07
  • @RendiChs I think that is another problem even if it is of the same program. It may be caused from your removal of the `for (int i = 0; i <= scores.size(); i +=3)` in MainActivity. Please separate that issue as a new question. – hata May 09 '20 at 07:24
  • let me clear it sir.. i have remove that looping in MainActivity.. now im asking ur looping `return (position + 1) % 4 == 0 ? 2 : 1;` << it is replace my item row, result look like 1, 2, 3, ad, 5.. my row 4 has been replace to ad, can fix it on result, 1, 2, 3, ad, 4, 5. – Rendi Chs May 09 '20 at 07:28
  • @RendiChs That means your code had two problems from the start. Ok, wait... – hata May 09 '20 at 07:38
  • ok thanks sir i have accept ur answer.. but its look annoying for `mlist.size` there is only `mList.size()` and i got error `java.lang.IndexOutOfBoundsException: Index: 5, Size: 5`. – Rendi Chs May 09 '20 at 07:50
  • Let us [continue this discussion in chat](https://chat.stackoverflow.com/rooms/213467/discussion-between-hata-and-rendi-chs). – hata May 09 '20 at 07:52