问题描述
我不熟悉 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();
}
}
}