Android Listview不刷新/重绘

时间:2017-05-10 13:38:41

标签: android listview

问题 - 我在Listview中有从应用商店加载的应用内购买列表。 当用户购买(点击列表视图中的按钮)时,购买该项目并且该按钮现在应该被隐藏,并且购买的列表项应该显示勾选图像。

我尝试了什么 -

  1. 通过调用notifyDataSetChanged
  2. 购买商品后刷新列表视图
  3. 使用View.GONEView.VISIBLE
  4. 设置按钮和图片的可见性

    上述所有内容似乎都无效。 我在应用结算库中使用了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();
    
        }
    
    }
    

1 个答案:

答案 0 :(得分:0)

(将评论移到帖子中)

用户购买产品后,productToPurchase中的产品是否已更新?适配器看起来没问题,因此购买后可能没有更新您正在使用的列表。

我假设您需要使用提供的productId在onProductPurchased()中翻转产品的isPurchased标志。