2017-05-10 27 views
1

問題 - App StoreからApp Storeのリストビューに読み込まれたアプリのリストがあります。 ユーザーが購入する(リストビューのボタンをタップする)と、アイテムが購入され、ボタンは非表示になり、購入したリストアイテムにはティックのイメージが表示されます。Android Listviewが更新/再描画されない

私が試してみました - 項目は、上記のいずれ

notifyDataSetChanged View.GONEを使用して、ボタンや画像の視認性を設定し

  • View.VISIBLE
  • を呼び出していないことにより、購入された後

    1. するとリストビューを更新動作するようです。 私は、ユーザーの購入の何かの後にアプリ内課金ライブラリで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(); 
      
          } 
      
      } 
      
    +0

    ユーザーが何かを購入した後、productsToPurchase内のProductは更新されますか?あなたが使用しているリストは、購入後に更新されていない可能性がありますので、アダプタはokieに見えます。私はあなたが提供されたproductId – jak10h

    +0

    を使ってonProductPurchased()のProductのisPurchasedフラグを反転する必要があると仮定しています。あなたが投稿した場合、あなたの答えを受け入れることを幸せにしてください:) – Coder

    +0

    聞いて良い!私は答えとして投稿しました – jak10h

    答えて

    0

    (ポストに移動コメント)

    を使用していますproductsToPurchase内の製品を更新したのですか?あなたが使用しているリストは、購入後に更新されていない可能性がありますので、アダプタはokieに見えます。

    提供されたproductIdを使用して、onProductPurchased()で商品のisPurchasedフラグを反転する必要があるとします。

    関連する問題