繁体   English   中英

如何设置 Recyclerview 适配器 onCallBack

[英]How to set Recyclerview adapter onCallBack

在我的活动的 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 后停止进入下一行,我做了一些研究,结果显示:

  1. 这是因为layoutManager的设置。
  2. 必须设置适配器 onCreate() 或主线程。

PS:我将 google play billing library 更新到了与此活动相关的课程的最新(4.0),google play billing 正在工作。

我建议你在 onStart of Activity 或 onViewCreated 在 Fragment 中创建视图后调用getPurchases() 这是为了避免在视图创建之前返回响应的情况。

接下来我假设你的ListView.setAdapter(listCardAdapter); 是一个错字,你的意思是它是listView 设置适配器后,您应该为recyclerView调用listCardAdapter.notifyDataSetChanged()以知道数据已更改。

最好的方法是最初设置没有构造函数参数的适配器,然后通过适配器中的方法添加数据,该方法接受订阅和 sku 详细信息作为参数。

另一个要强调的主要事情是,您永远不会点击项目,因为您正在适配器上设置onClickListener 你应该通过它获取所谓的接口参考onBindViewHolder方法和onClickListener应该对听众参考触发回调。

检查此答案以获取相同的代码片段。 这不是问题的一部分,因此将被视为一个单独的问题。

https://stackoverflow.com/a/24471410/4491971

经过更多研究,我发现您只需要更新适配器属性/数据而不是再次设置适配器,然后只需调用 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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM