Google InApp Billing - 将从onSkuDetailsResponse获得的skuDetailsList的标题绑定到列表视图控件中。

1 人关注

我是实施谷歌计费库的新手,并使用这个系统在我的应用程序内进行订阅。我正试图让 详单列表(skuDetailsList 这是由 onSkuDetailsResponse 并添加到ArrayList的数据源。我正在将ArrayList设置为适配器的数据源。问题是ListView每次都显示为空,即使ArrayList数据源中有项目可用。

我试着向数据源添加假值,发现它们被显示在列表视图控件中。因此,我调试了代码,发现视图首先被返回,然后项目被添加到ArrayList数据源,因为onSkuDetailsResponse被异步调用。

以下是用于建立连接、获取SKU详细信息、绑定数组列表和在 "OnCreateView "中设置适配器到ListView控件的全部代码。

建立连接的代码

private void startBillingServiceConnection(){
        //Initialize a billing client
        billingClient = BillingClient.newBuilder(this.getActivity())
                .setListener(this)
                .enablePendingPurchases()
                .build();
        //Establish a connection to Google Play
        billingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                if (billingResult.getResponseCode() ==  BillingClient.BillingResponseCode.OK) {
                    // The BillingClient is ready. You can query purchases here....
                    querySkuDetails();                        
            @Override
            public void onBillingServiceDisconnected() {
                // Try to restart the connection on the next request to
                // Google Play by calling the startConnection() method.

查询SkDetails的代码

public void querySkuDetails() {
        Log.i(TAG, "querySkuDetails");
        SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
        params.setSkusList(LIST_OF_SKUS).setType(BillingClient.SkuType.SUBS);
        billingClient.querySkuDetailsAsync(params.build(),
                new SkuDetailsResponseListener() {
                    @Override
                    public void onSkuDetailsResponse(BillingResult billingResult,
                                                     List<SkuDetails> skuDetailsList) {
                        if (billingResult == null) {
                            return;
                        int responseCode = billingResult.getResponseCode();
                        String debugMessage = billingResult.getDebugMessage();
                        switch (responseCode) {
                            case BillingClient.BillingResponseCode.OK:
                                if (skuDetailsList != null && skuDetailsList.size() > 0) {
                                    subscribeItemDisplay.clear();
                                    for (SkuDetails p : skuDetailsList) {
                                        subscribeItemDisplay.add("Product Name - "+p.getOriginalPrice()+": "+p.getSubscriptionPeriod()+": "+p.getFreeTrialPeriod());
                            default:                                    
                                break;

"OnCreateView "中的代码

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mainHandler = new Handler();
        // Inflate layout
        View view = inflater.inflate(R.layout.subscribe_fragment, container, false);            
        subscriptionsListView = view.findViewById(R.id.subscriptionsView);            
        loadInAppProductIDS();            
        return view;

loadInAppProductIDS的代码

public void loadInAppProductIDS() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                LIST_OF_SKUS= Collections.unmodifiableList(myProductIDs);
                startBillingServiceConnection();
                mainHandler.post(new Runnable() {
                    public void run() {
                        arrayAdapter = new ArrayAdapter<String>(getActivity(), R.layout.subscription_items_list, subscribeItemDisplay);
                        subscriptionsListView.setAdapter(arrayAdapter);
        }).start();

你能建议如何将项目添加到数据源,绑定到列表视图,然后返回视图吗?

java
android
android-listview
in-app-billing
onskudetailsresponce
Kamal
Kamal
发布于 2021-07-19
3 个回答
Keyur Nimavat
Keyur Nimavat
发布于 2021-07-27
0 人赞同

问题是你在一开始就设置了适配器,然后才从 onSkuDetailsResponse 加载列表,你应该在收到数据后再设置适配器。 所以你的代码应该是这样的。

View view = inflater.inflate(R.layout.subscribe_fragment, container, false);
---- Code here for establishing the connection to Google Play and querying skuDetails in the onBillingSetupFinished method ----
subscriptionsListView = view.findViewById(R.id.subscriptionsView);
return view;

而你的onSkuDetailResponse应该是这样的。

public void onSkuDetailsResponse(BillingResult billingResult,
                                 List<SkuDetails> skuDetailsList) {
    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
        if (skuDetailsList != null && skuDetailsList.size() > 0) {
            subscribeItemDisplay.clear();
            for(SkuDetails p:skuDetailsList){
                subscribeItemDisplay.add(p.getTitle());
            arrayAdapter = new ArrayAdapter<String>(this.getActivity(),
                    R.layout.subscribtion_item_list, subscribeItemDisplay);
            subscriptionsListView.setAdapter(arrayAdapter);
    
我已经试过这段代码了,但我在一开始就遇到了加载列表视图的问题。一旦我关闭该视图并重新加载它,我就可以在列表视图中看到SKU的详细信息。第一次加载SKUdetails时出现问题
如果两个视图都是一样的,那么就不应该是一个问题。你应该显示你的完整代码,你在哪里调用sku的细节,你在哪里显示在列表中?
我已经编辑了我的问题和所有需要的细节。请检查并提供一个解决方案,将产品绑定到列表视图控件上。
你的代码仍然是错误的,没有按照给出的解决方案。你正在调用startBillingServiceConnection(); 然后在处理程序中你试图设置适配器。这是不可能的。你必须在for循环后的onSkuDetailsResponse中设置适配器,正如我在解决方案中给出的那样。
我已经尝试在onSkuDetailsResponse中设置适配器,但每次都是空的列表被显示在列表视图控件中。
Yahya M
Yahya M
发布于 2021-07-27
0 人赞同

在你的ListView适配器中创建这个方法,向ListView添加数据。

public void add(String title) {
    titleLists.add(title)
    notifyItemInserted(titleLists.size - 1)

在你的活动类中调用add()函数。

if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                        if (skuDetailsList != null && skuDetailsList.size() > 0) 
                            subscribeItemDisplay.clear();
                            for(SkuDetails p:skuDetailsList){
                                subscribeItemDisplay.add(p.getTitle());
                                arrayAdapter.add(p.getTitle());
    
Vaibhav K
Vaibhav K
发布于 2021-07-27
0 人赞同

你可以在列表填充后通知适配器。

public void onSkuDetailsResponse(BillingResult billingResult,
                                                     List<SkuDetails> skuDetailsList) {
                        if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                            if (skuDetailsList != null && skuDetailsList.size() > 0) {
                                subscribeItemDisplay.clear();
                                for(SkuDetails p:skuDetailsList){
                                    subscribeItemDisplay.add(p.getTitle());