E / RecyclerView: адаптер не подключен; Пропуск макета / На Google Play биллинг - PullRequest
1 голос
/ 30 марта 2020

Эй, я хочу внедрить биллинг Google в мое приложение, но каждый раз, когда я открываю актив, где кнопка для вызова моей покупки выдает консоль, выводится сообщение "E / RecyclerView: адаптер не подключен; пропускает макет". кнопка расположена.

package com.test.smartbuyapp.Adapter;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.android.billingclient.api.BillingClient;
import com.android.billingclient.api.BillingFlowParams;
import com.android.billingclient.api.SkuDetails;
import com.test.smartbuyapp.InformationActivity;
import com.test.smartbuyapp.Interface.IProductClickListener;
import com.test.smartbuyapp.R;

import java.util.List;

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

    InformationActivity  informationActivity;
    List<SkuDetails> skuDetailsList;
    BillingClient billingClient;

    public MyProductAdapter(InformationActivity informationActivity, List<SkuDetails> skuDetailsList, BillingClient billingClient) {
        this.informationActivity = informationActivity;
        this.skuDetailsList = skuDetailsList;
        this.billingClient = billingClient;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        View itemView = LayoutInflater.from(informationActivity.getBaseContext())
                .inflate(R.layout.layout_product_item,viewGroup,false);
        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
         holder.txt_product.setText(skuDetailsList.get(position).getTitle());

         //Product click
        holder.setiProductClickListener(new IProductClickListener() {
            @Override
            public void onProductClickListerner(View view, int position) {
                //Launch Billing flow
                BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
                        .setSkuDetails(skuDetailsList.get(position))
                        .build();
                billingClient.launchBillingFlow(informationActivity,billingFlowParams);
            }
        });
    }

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

    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView txt_product;

        IProductClickListener iProductClickListener;

        public void setiProductClickListener(IProductClickListener iProductClickListener) {
            this.iProductClickListener = iProductClickListener;
        }

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            txt_product = (TextView) itemView.findViewById(R.id.txt_product_name);

            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            iProductClickListener.onProductClickListerner(v, getAdapterPosition());
        }
    }
}

и моя информационная активность

package com.test.smartbuyapp;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.android.billingclient.api.BillingClient;
import com.android.billingclient.api.BillingClientStateListener;
import com.android.billingclient.api.BillingResult;
import com.android.billingclient.api.Purchase;
import com.android.billingclient.api.PurchasesUpdatedListener;
import com.android.billingclient.api.SkuDetails;
import com.android.billingclient.api.SkuDetailsParams;
import com.android.billingclient.api.SkuDetailsResponseListener;
import com.test.smartbuyapp.Adapter.MyProductAdapter;

import java.util.Arrays;
import java.util.List;

public class InformationActivity extends AppCompatActivity implements PurchasesUpdatedListener {

    BillingClient billingClient;

    Button loadProduct;
    RecyclerView recyclerProduct;

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

            setupBillingClient();

            //View
            loadProduct = (Button) findViewById(R.id.btn_load_product);
            recyclerProduct = (RecyclerView)findViewById(R.id.recycler_product);
            recyclerProduct.setLayoutManager(new LinearLayoutManager(this));
            recyclerProduct.setHasFixedSize(true);


            //Event
            loadProduct.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(billingClient.isReady()) {
                        SkuDetailsParams params = SkuDetailsParams.newBuilder()
                                .setSkusList(Arrays.asList("adfree"))
                                .setType(BillingClient.SkuType.INAPP)
                        .build();

                        billingClient.querySkuDetailsAsync(params, new SkuDetailsResponseListener() {
                            @Override
                            public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> list) {
                                if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK){
                                    loadProductToRecyclerView(list);

                                }else{
                                    Toast.makeText(InformationActivity.this,"Cannot query product",Toast.LENGTH_SHORT);

                                }
                            }
                        });
                    }else {
                        Toast.makeText(InformationActivity.this,"Billing client not Ready",Toast.LENGTH_SHORT);

                    }
                }
            });

            //////////// Toolbar //////////////////////////////////////////////////////////////
            Toolbar toolbar = findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(true);
            getSupportActionBar().setTitle("Information");


        }

    private void loadProductToRecyclerView(List<SkuDetails> list) {
        MyProductAdapter adapter= new MyProductAdapter(this,list,billingClient);
        recyclerProduct.setAdapter(adapter);
    }

    private void setupBillingClient() {
            billingClient = BillingClient.newBuilder(this).setListener(this).enablePendingPurchases().build();
            billingClient.startConnection(new BillingClientStateListener() {
                @Override
                public void onBillingSetupFinished(BillingResult billingResult) {
                    if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK){
                        Toast.makeText(InformationActivity.this,"Sucessfully Billing Connect",Toast.LENGTH_SHORT);
                    }else {
                        Toast.makeText(InformationActivity.this,"Failed to Billing Connect"+billingResult.getResponseCode(),Toast.LENGTH_SHORT);

                    }

                }

                @Override
                public void onBillingServiceDisconnected() {
                    Toast.makeText(InformationActivity.this,"You are disconnected from billing",Toast.LENGTH_SHORT);

                }
            });
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()){

                case  android.R.id.home:
                    startActivity(new Intent(com.test.smartbuyapp.InformationActivity.this, ListMainActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
                    return true;

            }

            return false;
        }

    public void PrivacyPerform(View view) {
        TextView agb = (TextView) findViewById(R.id.AGB);

        agb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://sites.google.com/view/smartbuyapp/"));

                startActivity(intent);
            }
        });

    }

    @Override
    public void onPurchasesUpdated(BillingResult billingResult, @Nullable List<Purchase> list) {

            //Here if user clicks Buy, we will receive data
        Toast.makeText(InformationActivity.this,"Purchase item",Toast.LENGTH_SHORT);


    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...