【问题标题】:Unable to create an adapter with custom cards无法使用自定义卡创建适配器
【发布时间】:2017-07-22 12:40:01
【问题描述】:

我正在使用 cardslib 库在我的 Android 应用中添加卡片。它具有预定义的卡片布局,或者我们可以选择自定义布局。

在为回收站视图创建适配器时,仅接受具有预定义卡片布局的卡片对象列表。当我尝试将自定义卡片列表传递给构造函数时出现错误。

CardArrayRecyclerViewAdapter cardArrayRecyclerViewAdapter = new CardArrayRecyclerViewAdapter(getApplicationContext(), customCards);

以上代码显示错误。 customCards 是自定义卡片对象的列表。如何让它发挥作用?

【问题讨论】:

  • 错误是什么?
  • 错误:(53, 127) 错误:不兼容的类型:List 无法转换为 List

标签: android android-arrayadapter android-cardview android-recyclerview


【解决方案1】:

在您的CardArrayRecyclerViewAdapter 中,在构造函数中将List<Card> 更改为List<CustomCard>

【讨论】:

  • 问题是CardArrayRecyclerViewAdapter 是库中的内置适配器。我可以调整它吗?
  • 然后你必须将List<Card> 传递给适配器。发布更多代码,以便有人找到解决方案。
【解决方案2】:

您可以在下面编写自定义卡适配器

  1. 卡适配器调用就像

    List<CustomCard> cardlist = new ArrayList<>();
    recyclerView.setHasFixedSize(true);
    // recyclerView
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    // create an Object for Adapter
    CardDataAdapter  mAdapter = new CardDataAdapter(cardlist);
    // set the adapter object to the Recyclerview
    recyclerView.setAdapter(mAdapter);
    
  2. 自定义适配器

      class CardDataAdapter extends RecyclerView.Adapter<CardDataAdapter.ViewHolder> {
    
    private List<CustomCard> dataSet;
    
    public CardDataAdapter(List<CustomCard> list) {
    
        dataSet = list;
    }
    
    
    @Override
    public CardDataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        // create a new view
        View itemLayoutView = LayoutInflater.from(viewGroup.getContext()).inflate(
                R.layout.row_custom_card, null);
    
        itemLayoutView.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT));
    
        // create ViewHolder
    
        CardDataAdapter.ViewHolder viewHolder = new CardDataAdapter.ViewHolder(itemLayoutView);
    
        return viewHolder;
    }
    
    
    @Override
    public void onBindViewHolder(CardDataAdapter.ViewHolder viewHolder, int i) {
    
        CustomCard fp = dataSet.get(i);
    
        viewHolder.tv_title.setText(fp.getName());
    
    
        viewHolder.feed = fp;
    }
    
    @Override
    public int getItemCount() {
    
        return dataSet.size();
    }
    
    // inner class to hold a reference to each item of RecyclerView
    public  class ViewHolder extends RecyclerView.ViewHolder {
    
        public TextView tv_title;
    
        public NotificationModel feed;
    
        public ViewHolder(View itemLayoutView) {
            super(itemLayoutView);
    
            tv_title = (TextView) itemLayoutView  .findViewById(R.id.tv_title);
            itemLayoutView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                   //Write here
    
                }
            });
    
    
    
           }
    
        }
     }
    
  3. 注意:CustomCard 是模型和 row_custom_card 布局 xml,其中名称 Textview resde

【讨论】:

    【解决方案3】:

    CardArrayRecyclerViewAdapter 构造函数的第二个参数必须是 List&lt;Card&gt; 类型。我知道List&lt;CustomCard&gt; 似乎应该在这里工作,但它不会。

    如果不查看更多代码,就不可能说出解决此问题的最佳方法是什么,但您可以这样做:

    List<Card> cards = new ArrayList<>();
    cards.addAll(customCards);
    // now call constructor with `cards` instead of `customCards`
    

    您可以在此处阅读更多关于为什么 List&lt;CustomCard&gt; 不接受 List&lt;Card&gt; 参数Is List<Dog> a subclass of List<Animal>? Why aren't Java's generics implicitly polymorphic?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多