Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

All data not shown but AdMobs with RecyclerView

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.

like image 939
Rendi Chs Avatar asked Dec 23 '25 02:12

Rendi Chs


1 Answers

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());
    }
}
like image 195
hata Avatar answered Dec 24 '25 17:12

hata



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!