微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Google InApp Billing - 将从 onSkuDetailsResponse 获得的 skuDetailsList 的标题绑定到列表视图控件

我不熟悉 Google 结算库的实施以及使用此系统在我的应用内进行订阅。我正在尝试获取onSkuDetailsResponse 获得的 skuDetailsList标题添加到 ArrayList 数据源。我将 ArraryList 设置为适配器的数据源。问题是 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.
            }
        });
    }

querySkDetails 代码

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();
    }

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

解决方法

问题是您在从 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);
        }
    }
}
,

在您的 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());
                            }
                        }
                    }
,

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

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());
                                }
                                notifyDataSetChanged();
                            }
                        }
                    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。