1
問題 - App StoreからApp Storeのリストビューに読み込まれたアプリのリストがあります。 ユーザーが購入する(リストビューのボタンをタップする)と、アイテムが購入され、ボタンは非表示になり、購入したリストアイテムにはティックのイメージが表示されます。Android Listviewが更新/再描画されない
私が試してみました - 項目は、上記のいずれ
notifyDataSetChanged
View.GONE
を使用して、ボタンや画像の視認性を設定し
View.VISIBLE
- するとリストビューを更新動作するようです。 私は、ユーザーの購入の何かの後にアプリ内課金ライブラリでthis
public class ListViewAdapter extends ArrayAdapter<Product> { private ArrayList<Product> iapProducts= new ArrayList<>(); private final LayoutInflater inflater; private final Activity activity; public ArrayList<Product> getIapProducts() { return iapProducts; } public void setIapProducts(ArrayList<Product> iapProducts) { this.iapProducts = iapProducts; } public ListViewAdapter(final Activity context) { super(context, 0); inflater = LayoutInflater.from(context); this.activity = context; } @Override public int getCount() { return this.iapProducts.size(); } public String getItem(String position) { return position; } @Override public boolean hasStableIds(){ return true; } public void addAll(ArrayList<Product> iapProducts){ this.iapProducts.addAll(iapProducts); notifyDataSetChanged(); } public static class ViewHolder { public TextView name; public ImageView imageView; public Button purchaseButton; } @Override public View getView(int position, View convertView, ViewGroup parent) { View vi = convertView; final ViewHolder holder; if (convertView == null) { vi = inflater.inflate(R.layout.names_filter_row, null); holder = new ViewHolder(); holder.name = (TextView) vi.findViewById(R.id.languageName); holder.imageView = (ImageView) vi.findViewById(R.id.imgTick); holder.purchaseButton = (Button) vi.findViewById(R.id.iapProductPurchaseBtn); vi.setTag(holder); } else { holder = (ViewHolder) vi.getTag(); } final Product product = iapProducts.get(position); holder.name.setText(product.getTitle()); holder.purchaseButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onItemPurchased(v); } }); holder.iapProductId.setText(product.getProductId()); holder.purchaseButton.setText(product.getPriceText()); holder.imageView.setVisibility(View.GONE); if(product.isPurchased()){ holder.purchaseButton.setVisibility(View.GONE); holder.imageView.setVisibility(View.VISIBLE); }else{ holder.purchaseButton.setVisibility(View.VISIBLE); holder.imageView.setVisibility(View.GONE); } return vi; } private void onItemPurchased(View v){ final RelativeLayout parentLayout = (RelativeLayout)v.getParent(); final TextView productId = (TextView)parentLayout.findViewById(R.id.iapProductId); final ImageView languageCheck = (ImageView)parentLayout.findViewById(R.id.imgTick); PurchaseActivity purchaseActivity = (PurchaseActivity) this.activity; purchaseActivity.purchaseItem(productId.getText().toString(), v); } } public class PurchaseActivity extends AppCompatActivity implements BillingProcessor.IBillingHandler { private BillingProcessor bp; boolean isOneTimePurchaseSupported; private ArrayList<Product> productsToPurchase = new ArrayList<>(); private final static String TAG = PurchaseActivity.class.getName(); private ListViewAdapter adapter; private ImageView imageTick; private Button buttonPurchase; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_purchase); bp = BillingProcessor.newBillingProcessor(this, "billingKey", this); // doesn't bind bp.initialize(); // binds adapter = new ListViewAdapter(this); nameFilterListView.setAdapter(adapter); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (!bp.handleActivityResult(requestCode, resultCode, data)) { super.onActivityResult(requestCode, resultCode, data); } } @Override public void onBillingInitialized() { isOneTimePurchaseSupported = bp.isOneTimePurchaseSupported(); if(isOneTimePurchaseSupported){ loadIAPData(false); }else{ Toast.makeText(this,"Billing not supported",Toast.LENGTH_LONG).show(); } } private void loadIAPData(boolean showProgressDialog){ bp.loadOwnedPurchasesFromGoogle(); final List<SkuDetails> productDetails = bp.getPurchaseListingDetails(productList); if(productDetails!= null && !productDetails.isEmpty()){ //fetch products and add to the list productsToPurchase.add(product); } //add all the products to adapter adapter.addAll(productsToPurchase); } } public void purchaseItem(@NonNull final String productId, final View imageTick, final View button){ this.imageTick = (ImageView) imageTick; this.buttonPurchase = (Button) button; bp.purchase(this,productId); } @Override public void onProductPurchased(String productId, TransactionDetails details) { //hide button show image this.imageTick.setVisibility(View.VISIBLE); this.buttonPurchase.setVisibility(View.GONE); adapter.setIapProducts(new ArrayList<>(productsToPurchase)); adapter.notifyDataSetChanged(); } }
ユーザーが何かを購入した後、productsToPurchase内のProductは更新されますか?あなたが使用しているリストは、購入後に更新されていない可能性がありますので、アダプタはokieに見えます。私はあなたが提供されたproductId – jak10h
を使ってonProductPurchased()のProductのisPurchasedフラグを反転する必要があると仮定しています。あなたが投稿した場合、あなたの答えを受け入れることを幸せにしてください:) – Coder
聞いて良い!私は答えとして投稿しました – jak10h