如何设置 Recyclerview 适配器 onCallBack
How to set Recyclerview adapter onCallBack
在我的 activity 的 onCreate() 上,我初始化了 recyclerview
private RecyclerView listView;
private Subscription subscription;
@Override
protected void onCreate(Bundle savedInstanceState) {
listView = findViewById(R.id.subscription_list);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(RecyclerView.VERTICAL);
listView.setLayoutManager(layoutManager);
getPurchases(); //runs a service and sets subscription value and calls back onSkuDetails
}
@Override
public void onSkuDetails(List<SkuDetails> skuDetails) {
ListCardAdapter listCardAdapter = new ListCardAdapter(getApplicationContext(), subscription, skuDetails);
ListCardAdapter.setOnItemClickListener(this);
//this will return RecyclerView: No adapter attached; skipping layout
listView.setAdapter(listCardAdapter);
removeProgressDialog();
}
我尝试在 onSkuDetails 中设置 layoutManager 但它在 setLayoutManager 之后停止转到下一行,我做了一些研究,结果说:
- 是layoutManager的设置问题
- 必须设置适配器 onCreate() 或主线程。
PS:我将 google 播放计费库更新到最新的 (4.0),我的 类 与此 activity、google 相关发生了变化播放计费正在运行。
建议在Activity的onStart或Fragment的onViewCreated中创建视图后调用getPurchases()
。这是为了避免在视图创建之前返回响应的情况。
接下来我假设你的 ListView.setAdapter(listCardAdapter);
是一个错字,你的意思是 listView
。设置适配器后,您应该为 recyclerView
调用 listCardAdapter.notifyDataSetChanged()
以了解数据已更改。
最好的方法是在最初设置适配器 时不带 构造函数参数,然后通过适配器中接受订阅和 sku 详细信息作为参数的方法添加数据。
还要强调的另一件事是,您永远不会点击该项目,因为您在适配器上设置了 onClickListener
。您应该传递一个在 onBindViewHolder
方法中调用的接口引用,并且 onClickListener
应该在该侦听器引用上触发回调。
检查此答案以获取相同的代码片段。这不是问题的一部分,因此将被视为一个单独的问题。
经过更多研究,我发现您只需要更新适配器 properties/data 而不是再次设置适配器,然后只需调用 notifyDataSetChanged()
private ListCardAdapter listCardAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
listView = findViewById(R.id.subscription_list);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(RecyclerView.VERTICAL);
listView.setLayoutManager(layoutManager);
listCardAdapter= new ListCardAdapter(getApplicationContext());
listCardAdapter.setOnItemClickListener(this);
listCardAdapter.setAdapter(subscriptionListCardAdapter);
getPurchases();
}
@Override
public void onSkuDetails(List<SkuDetails> skuDetails) {
removeProgressDialog();
listCardAdapter.setData(subscription, skuDetails);
}
//ListCardAdapter
public void setData(Subscription subscription, List<SkuDetails> skuDetailsList) {
this.subscription = subscription;
this.skuDetailsList = skuDetailsList;
notifyDataSetChanged();
}
在我的 activity 的 onCreate() 上,我初始化了 recyclerview
private RecyclerView listView;
private Subscription subscription;
@Override
protected void onCreate(Bundle savedInstanceState) {
listView = findViewById(R.id.subscription_list);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(RecyclerView.VERTICAL);
listView.setLayoutManager(layoutManager);
getPurchases(); //runs a service and sets subscription value and calls back onSkuDetails
}
@Override
public void onSkuDetails(List<SkuDetails> skuDetails) {
ListCardAdapter listCardAdapter = new ListCardAdapter(getApplicationContext(), subscription, skuDetails);
ListCardAdapter.setOnItemClickListener(this);
//this will return RecyclerView: No adapter attached; skipping layout
listView.setAdapter(listCardAdapter);
removeProgressDialog();
}
我尝试在 onSkuDetails 中设置 layoutManager 但它在 setLayoutManager 之后停止转到下一行,我做了一些研究,结果说:
- 是layoutManager的设置问题
- 必须设置适配器 onCreate() 或主线程。
PS:我将 google 播放计费库更新到最新的 (4.0),我的 类 与此 activity、google 相关发生了变化播放计费正在运行。
建议在Activity的onStart或Fragment的onViewCreated中创建视图后调用getPurchases()
。这是为了避免在视图创建之前返回响应的情况。
接下来我假设你的 ListView.setAdapter(listCardAdapter);
是一个错字,你的意思是 listView
。设置适配器后,您应该为 recyclerView
调用 listCardAdapter.notifyDataSetChanged()
以了解数据已更改。
最好的方法是在最初设置适配器 时不带 构造函数参数,然后通过适配器中接受订阅和 sku 详细信息作为参数的方法添加数据。
还要强调的另一件事是,您永远不会点击该项目,因为您在适配器上设置了 onClickListener
。您应该传递一个在 onBindViewHolder
方法中调用的接口引用,并且 onClickListener
应该在该侦听器引用上触发回调。
检查此答案以获取相同的代码片段。这不是问题的一部分,因此将被视为一个单独的问题。
经过更多研究,我发现您只需要更新适配器 properties/data 而不是再次设置适配器,然后只需调用 notifyDataSetChanged()
private ListCardAdapter listCardAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
listView = findViewById(R.id.subscription_list);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(RecyclerView.VERTICAL);
listView.setLayoutManager(layoutManager);
listCardAdapter= new ListCardAdapter(getApplicationContext());
listCardAdapter.setOnItemClickListener(this);
listCardAdapter.setAdapter(subscriptionListCardAdapter);
getPurchases();
}
@Override
public void onSkuDetails(List<SkuDetails> skuDetails) {
removeProgressDialog();
listCardAdapter.setData(subscription, skuDetails);
}
//ListCardAdapter
public void setData(Subscription subscription, List<SkuDetails> skuDetailsList) {
this.subscription = subscription;
this.skuDetailsList = skuDetailsList;
notifyDataSetChanged();
}