Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将项目从RecyclerView更改为onBindViewHolder_Java_Android_Android Recyclerview_Adapter - Fatal编程技术网

Java 将项目从RecyclerView更改为onBindViewHolder

Java 将项目从RecyclerView更改为onBindViewHolder,java,android,android-recyclerview,adapter,Java,Android,Android Recyclerview,Adapter,在我的onBindViewHolder上我有这个设置setImageResource holder.card_image.setImageResource(image); 但是我的物品是可以购买的,所以我要在我的holder.view.setOnClickListener()上购买它 因此,它采用这种方法: bp = new BillingProcessor() new BillingProcessor.IBillingHandler() { @Override

在我的
onBindViewHolder上
我有这个设置
setImageResource

holder.card_image.setImageResource(image);
但是我的物品是可以购买的,所以我要在我的
holder.view.setOnClickListener()上购买它

因此,它采用这种方法:

bp = new BillingProcessor() new BillingProcessor.IBillingHandler() {
            @Override
            public void onProductPurchased(@NonNull String productId, @Nullable TransactionDetails details) {
                showToast("onProductPurchased: " + productId);
                //Purchased OK
                //WANT TO CHANGE THE IMAGE ONCE PURCHASE IS OK


            }
            @Override
            public void onBillingError(int errorCode, @Nullable Throwable error) {
                showToast("onBillingError: " + Integer.toString(errorCode));
            }
            @Override
            public void onBillingInitialized() {
                showToast("onBillingInitialized");
                readyToPurchase = true;

            }
            @Override
            public void onPurchaseHistoryRestored() {
                showToast("onPurchaseHistoryRestored");
                for(String sku : bp.listOwnedProducts())
                    Log.d("skuProducts", "Owned Managed Product: " + sku);
                for(String sku : bp.listOwnedSubscriptions())
                    Log.d("skuProducts", "Owned Subscription: " + sku);

            }
        });
如果我不在BindViewHolder上,如何更改它

我的适配器看起来像:

FirebaseRecyclerAdapter adapter = new   FirebaseRecyclerAdapter< CardPOJO, CardHolder>(options) {
        @Override
        public CardHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            //inflate the single recycler view layout(item)
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.card_product, parent, false);
            int width = parent.getMeasuredWidth() / 2;
            width -= mContext.getResources().getDimensionPixelSize(R.dimen._8sdp);
            final CardHolder cardViewHolder = new CardHolder(view,width);
            return cardViewHolder;
        }

        @Override
        public void onDataChanged() {
            super.onDataChanged();
            tv.setVisibility(getItemCount() == 0 ? View.VISIBLE : View.GONE);
        }

        @Override
        protected void onBindViewHolder(CardHolder holder, int position, final CardPOJO model) {
            holder.state.setText(model.getState());
            holder.cardName.setText(model.getName());
            switch (model.getState()){
                case "free":
                    //Img free
                    break;
                case "not_free":
                    //Img not free
                    break;
                default:
                    break;
            }
            holder.view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(model.getState().equals("free")){
                       //stuff
                    }
                    else{
                       //stuff
                        }
                        root_ref.child("PurchasedProducts").child(currentuser).addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                bp.purchase((Activity) mContext,model.getProduct_id()); //HERE I CALL THE PURCHASE SO IF IT'S OK I WANT TO DO SOMETHING LIKE holder.card_image.setImageResource(image);
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        });
                    }

                }
            });


        }
    };
    adapter.startListening();
    products_recycler.setAdapter(adapter);
FirebaseRecyclerAdapter=新FirebaseRecyclerAdapter(选项){
@凌驾
公共持卡人onCreateViewHolder(视图组父级,int-viewType){
//为单个回收器视图布局(项目)充气
View=LayoutInflater.from(parent.getContext())
.充气(R.layout.card_产品、父项、假);
int width=parent.getMeasuredWidth()/2;
宽度-=mContext.getResources().getDimensionPixelSize(R.dimen.\u 8sdp);
最终持卡人卡片VIEWHOLDER=新持卡人(视图、宽度);
退换证持有人;
}
@凌驾
公共无效onDataChanged(){
super.onDataChanged();
tv.setVisibility(getItemCount()==0?View.VISIBLE:View.GONE);
}
@凌驾
受保护的无效onBindViewHolder(持卡人持有人、内部位置、最终CardPOJO型号){
holder.state.setText(model.getState());
holder.cardName.setText(model.getName());
开关(model.getState()){
“免费”案例:
//无Img
打破
案例“不自由”:
//Img不是免费的
打破
违约:
打破
}
holder.view.setOnClickListener(新的view.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(model.getState().equals(“free”)){
//东西
}
否则{
//东西
}
root_ref.child(“PurchasedProducts”).child(currentuser).addValueEventListener(新的ValueEventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
bp.purchase((Activity)mContext,model.getProduct_id());//这里我调用purchase,因此如果可以的话,我想做一些类似holder.card_image.setImageResource(image)的事情;
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
}
});
}
};
adapter.startListening();
产品回收器。设置适配器(适配器);

RecyclerView
的适配器获取您的项目并对其进行编辑。然后只需调用
Adapter.onItemChanged(int position)
,这将导致调用
onBindViewholder
,专门针对该位置进行调用。

如果我假设正确,您希望更改视图外观,或者在某些付款成功或失败时更改某些图像

为此,您可以有一个回调,它将为您提供活动或片段中的项目位置。从那里,您可以进行服务器调用,以实现购买,如果一切顺利

当您使适配器构造函数通过回调时

final SomeAdapter obj = new SomeAdapter(this,new Callback(){
      @Override
      onPaymentRequested(int position, View view){
        //this will get called when you press click on image in bindviewholder
        bp = new BillingProcessor() new BillingProcessor.IBillingHandler() {
            @Override
            public void onProductPurchased(@NonNull String productId, @Nullable TransactionDetails details) {
                showToast("onProductPurchased: " + productId);
                //Purchased OK
                adapterModelList.get(position).setPayment(true);
                obj.notifyDataSetChanged();

            }
            @Override
            public void onBillingError(int errorCode, @Nullable Throwable error) {
                showToast("onBillingError: " + Integer.toString(errorCode));
            }
            @Override
            public void onBillingInitialized() {
                showToast("onBillingInitialized");
                readyToPurchase = true;

            }
            @Override
            public void onPurchaseHistoryRestored() {
                showToast("onPurchaseHistoryRestored");
                for(String sku : bp.listOwnedProducts())
                    Log.d("skuProducts", "Owned Managed Product: " + sku);
                for(String sku : bp.listOwnedSubscriptions())
                    Log.d("skuProducts", "Owned Subscription: " + sku);

            }
        });

    }
    });
recyclerView.setAdapter(obj);
因此,当您调用对象时,notifyDataSetChanged()这将使适配器再次绘制所有视图,您可以根据收到的用于单击回调的int位置设置一些标志,并相应地进行更改

Edit=>07/12/2018:尝试了Firebase适配器并做了一些更改,因为代码不足以复制场景,但我制作了一个示例类,做了一些更改,但基本思想如下

1:当用户在onBindViewHolder中单击view时,我们收到一个回调,它在我们调用的片段或活动中给出一个位置参数

2:现在我们处理付款,当我们完成后,我们在数据库firebase中进行了更改,也为该特定用户项目将CardPojo更新到服务器

3:当我们更新服务器上的CardPojo时,我们还在CardPojo中设置了一个标志,它是paymentSuccess的布尔值,当支付完成时将为true

4:由于我们的付款已经完成,并且已经与服务器同步了新的标志数据,现在我们可以调用
firebaseRecycler.notifyItemChanged(position)
将从服务器获取我们在回调时收到的特定位置的最新更新

public class FirebaseRecycler extends FirebaseRecyclerAdapter<CardPOJO,CardHolder> {

CallBackInterface callBackInterface;

public FirebaseRecycler(Class<CardPOJO> modelClass, int modelLayout, Class<CardHolder> viewHolderClass, DatabaseReference ref) {
    super(modelClass, modelLayout, viewHolderClass, ref);
    this.callBackInterface = callBackInterface;
}

public FirebaseRecycler(Class<CardPOJO> modelClass, int modelLayout, Class<CardHolder> viewHolderClass, Query ref) {
    super(modelClass, modelLayout, viewHolderClass, ref);
    this.callBackInterface = callBackInterface;
}

@Override
public CardHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    //your inflater logic goes here
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_product, parent, false);
    CardHolder cardHolder = new CardHolder(view);
    return cardHolder;
}

@Override
protected void populateViewHolder(CardHolder viewHolder, final CardPOJO model, final int position) {
    //your populate logic
    //your existing code here

    if (model.isPaymentDone){
        //set payment success image holder.card_image.setImageResource(image);

    }else{
        //set payment failure image

    }

    //setting the card click listener
    viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //we have the card click listener, we will start the payment processing in activity
            callBackInterface.onClick(position,model);
        }
    });
}

public void setCallBackInterface(CallBackInterface callBackInterface) {
    this.callBackInterface = callBackInterface;
}
5:现在populateViewHolder()为您提供了一个cardpojo对象,您可以检查付款是否完成,然后您可以更改图像

这是我尝试过的与场景匹配的示例代码,希望您理解我在这里要做的事情

因此,首先创建一个侦听器或回调

public interface CallBackInterface  {
    void onClick(int position,CardPOJO cardPOJO);
}
现在,不必在activity或fragment中初始化FirebaseRecyclerAdapter,只需创建一个类并对其进行扩展,这将分离您的ui逻辑,并为我们提供执行额外操作(如添加回调)的可扩展性

public class FirebaseRecycler extends FirebaseRecyclerAdapter<CardPOJO,CardHolder> {

CallBackInterface callBackInterface;

public FirebaseRecycler(Class<CardPOJO> modelClass, int modelLayout, Class<CardHolder> viewHolderClass, DatabaseReference ref) {
    super(modelClass, modelLayout, viewHolderClass, ref);
    this.callBackInterface = callBackInterface;
}

public FirebaseRecycler(Class<CardPOJO> modelClass, int modelLayout, Class<CardHolder> viewHolderClass, Query ref) {
    super(modelClass, modelLayout, viewHolderClass, ref);
    this.callBackInterface = callBackInterface;
}

@Override
public CardHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    //your inflater logic goes here
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_product, parent, false);
    CardHolder cardHolder = new CardHolder(view);
    return cardHolder;
}

@Override
protected void populateViewHolder(CardHolder viewHolder, final CardPOJO model, final int position) {
    //your populate logic
    //your existing code here

    if (model.isPaymentDone){
        //set payment success image holder.card_image.setImageResource(image);

    }else{
        //set payment failure image

    }

    //setting the card click listener
    viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //we have the card click listener, we will start the payment processing in activity
            callBackInterface.onClick(position,model);
        }
    });
}

public void setCallBackInterface(CallBackInterface callBackInterface) {
    this.callBackInterface = callBackInterface;
}

这演示了基本逻辑,您可以根据需要对其进行修补。

我考虑过callBack(),但不知道如何集成到Android中。。我必须把回叫放在哪里?什么是适配器?我的适配器?如果你能粘贴你的适配器代码,那么我可以帮助你其他方面我会创建一个虚拟适配器来显示过程让我知道。抱歉@Stuart2041我不熟悉firebase适配器,所以我无法帮你,我以为你在使用recyclerview adapter它扩展了recyclerview和recyclerview adapter这几乎是一样的。好吧,让我重温一下,如果可能的话,你能发布你使用firebase ui适配器a的片段或活动吗
  @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    final DatabaseReference mDatabaseRef = FirebaseDatabase.getInstance().getReference();
    /*
    if you have any other database child then you can refer to it using
    DatabaseReference child = mDatabaseRef.child("yourchilddatabase");
    and pass this to the last argument
     */

    final FirebaseRecycler firebaseRecycler = new FirebaseRecycler(CardPOJO.class, R.layout.card_product, CardHolder.class, mDatabaseRef);
    firebaseRecycler.setCallBackInterface(new CallBackInterface() {
        @Override
        public void onClick(final int position, final CardPOJO cardPOJO) {
            //start processing the payment

            bp = new BillingProcessor() new BillingProcessor.IBillingHandler() {
                @Override
                public void onProductPurchased(@NonNull String productId, @Nullable TransactionDetails details) {
                    /**
                     *when you have processed the payment just enable the flag on server database by having a extra boolean flag for this
                     * and check in onBindViewHolder if this is enabled if so then replace your image
                     * updating the values on server, you can handle it according to your user case
                     */
                    cardPOJO.setPaymentDone(true);
                    mDatabaseRef.push().setValue(cardPOJO);
                    firebaseRecycler.notifyItemChanged(position);

                }

                @Override
                public void onBillingError(int errorCode, @Nullable Throwable error) {
                    //existing logic
                }

                @Override
                public void onBillingInitialized() {
                    //existing logic
                }

                @Override
                public void onPurchaseHistoryRestored() {
                    //existing logic
                }
            };

        }
    });

}