- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的onBindViewHolder
上,我用它来设置setImageResource
holder.card_image.setImageResource(image);
但是我的元素可以购买,所以我可以在我的 holder.view.setOnClickListener()
bp.purchase((Activity) mContext,model.getProduct_id());
所以,它转到这个方法:
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);
}
});
如果我没有 onBindViewHolder
,如何更改它?
我的适配器看起来像:
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);
最佳答案
如果我正确地假设您想要更改 View 外观或在某些付款成功或失败时更改某些图像。
为此,您可以进行回调,它将为您提供 Activity 或 fragment 中的项目位置,从那里您可以进行服务器调用以进行购买,如果一切顺利的话。
当你让适配器构造函数传递回调时
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);
因此,当您调用 obj.notifyDataSetChanged(); 时,它将使适配器再次绘制所有 View ,您可以根据收到的点击回调的 int 位置设置一些标志,并使其相应更改.
编辑=>07/12/2018:尝试了 Firebase 适配器并做了一些更改,因为代码不足以复制场景,但我对示例类做了一些更改,但基本的想法如下。
1:当用户单击 onBindViewHolder 中的 View 时,我们会收到一个回调,该回调给出了我们调用的 fragment 或 Activity 中的位置参数
2:现在我们处理付款,完成后我们还通过将 CardPojo 更新到该特定用户项目的服务器来对数据库 firebase 进行更改。
3:当我们更新服务器上的 CardPojo 时,我们还在card pojo 中设置了一个标志,它是 paymentSuccess 的 boolean 值,付款完成后将为 true。
4:由于我们的付款已完成,并且已与具有新标志数据的服务器同步,现在我们只需调用 firebaseRecycler.notifyItemChanged(position);
即可从服务器获取该特定的最新更新我们在回调中收到的位置。
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;
}
}
现在几乎所有事情都已完成,我们需要调用此自定义 Firebase 适配器并传递所需的内容,它将完成其工作。
@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
}
};
}
});
}
这演示了您可以根据您的要求对其进行修补的基本逻辑。
关于java - 将 RecyclerView 中的项目更改为 onBindViewHolder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48116701/
我正在开发我的应用程序,它要求电影海报的比例为 1:2。我找到了一种方法来做到这一点就是运行 movieAdapterViewHolder.posterview.requestLayo
我在 CardAdapter 中使用 onBindViewHolder。它包括 checkedTextView 的 onClick 方法。我试图获取这些文本并将其放入 Arraylist(shared
在适配器 submitList 到 DiffUtil 之后,调用 onBindViewHolder 并且出于某种原因它总是将列表滚动到顶部。 我尝试了 SO 中关于在 recyclerview 更新列
我收到错误:“FlickrRecyclerViewAdapter”类必须声明为抽象类或在“适配器”中实现方法抽象方法 onBindViewHolder(VH, int) 虽然这个错误应该是 self
我有一个 recyclerview 显示我的数据。在我的适配器类中,在 onBindViewHolder() 中,我为一个按钮创建了一个监听器,该按钮在单击时删除了一行。第一次工作得很好,但如果我尝试
如果图像不存在,我将尝试下载它们;如果已经下载,我将尝试保留并重新使用它们。 下载和展示作品时,不会重复使用它们。似乎 mValues 在不同的调用中不是相同的 mValues。 这是我的代码 pub
我已经将第三方库用于进度条,一切正常,但在 onBindViewHolder 方法中,当我编写 holder.donutprogress.setFinishedStrokeColor(colorsda
ViewPager 发布 1.0.0 版本 对于普通的 RecyclerView,holder.itemView给我当前绑定(bind)/渲染的 View 。 但是,FragmentStateAdap
我想在下一类 ChildViewHolder 的 onBindViewHolder 中访问 DayOfWeek,这样我就可以在 if 语句中使用它,如 ChildRecyclerAdapter 中所示
我在recycview中有很多按钮我只是想将它们添加到数组中,然后让它们添加一些工作。 首先我定义了数组名称“buttons”ToggleButton 按钮[] = new ToggleButton[
当我调用notifyDataSetChanged()时,它不会调用我的onBindViewHolder,我不知道它为什么这样做,我当前正在使用自定义布局,不知道这是否与它有关。 有人有什么想法吗?这是
我有一个TestActivity: public class TestActivity extends AppCompatActivity { @Override protected
我想填写诸如用户名、全名之类的内容,显示 follow_btn 的可见性。最大的问题是我不能在 onbindviewholder 中使用。它用红色下划线标出。你能帮我吗? 错误是:error: can
我正在尝试使用 RecyclerView 显示一个左侧有图像、右侧有标题的列表。 通过 for 循环,我在 ArrayList 中添加了标题和图像 String[] mtitles = {"Title
您好,当 recyclerview 第一次创建 OnbindViewHolder 时,我遇到了一个奇怪的问题,直到 recyclerview 中的最后一个项目被调用,然后当我滚动时OnbindView
onBindViewHolder 在数据绑定(bind)到 View 后的第一个位置和最后一个位置意外调用。这造成了问题,因为当我尝试向列表中添加项目时,最后一项的 ImageViews(相似和不同)
设置 我有一个带有自定义适配器和自定义 ViewHolder 的 RecyclerView。 我理解 onCreateViewHolder() 方法在 RecyclerView 用完 ViewHold
我知道这个问题已被多次询问与 ListViews 有关,但我一直无法真正理解解决方案。我知道 RecyclerViewAdapter 中 onBindViewHolder() 的位置参数类似于 lis
我已经将 RececlerView 与 ViewHolder 模式结合使用了一段时间。我正在实现自定义 Adapter。 我不是在我的代码中搜索特定的错误帮助。 我只是想知道,如果它是正常的,onBi
当我在我的 RecyclerView 上调用 notifyItemChanged() 时,相应的 Views(在本例中为按钮)没有按预期更新.我调用他们的原因是数据已经改变,这会导致他们的背景颜色改变
我是一名优秀的程序员,十分优秀!