Google InApp Billing-从onSkuDetailsRespone获得的skuDetailsList的绑



我是谷歌计费库实现的新手,并使用该系统在我的应用程序中进行订阅。我正在尝试获取skuDetailsList的标题,该标题是从onSkuDetailsRespone上获得的,并添加到ArrayList数据源中。我正在将ArraryList设置为适配器的数据源。问题是,即使ArrayList DataSource中有可用的项,ListView每次都显示为空。

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

以下是用于建立连接、获取SKU详细信息、绑定其数组列表并将适配器设置为"中的ListView控件的完整代码;OnCreateView";

建立连接的代码

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

加载InAppProductIDS的代码

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

最新更新