在 RecyclerView 内的 ListViews 中显示项目

Posted

技术标签:

【中文标题】在 RecyclerView 内的 ListViews 中显示项目【英文标题】:Displaying items in ListViews inside a RecyclerView 【发布时间】:2019-09-03 01:56:57 【问题描述】:

我有一个List<CopyModel> copyData,其中包含我的所有数据,我想显示。 CopyModel 类如下所示:

public class CopyModel 
  public String autoId;
  public List<String> fieldNames;
  public List<Object> values;

我想显示 fieldNamesvalues 的项目。我从 FireStore 获得的确切数据

我在 ListView 中显示它们,simple_list_item_2。 代码如下:

@Override
public void onBindViewHolder(ViewHolder holder, final int position) 
    ArrayAdapter adapter = new ArrayAdapter(mContext, android.R.layout.simple_list_item_2, android.R.id.text1, copyData) 
        @Override
        public View getView(int position, View convertView, ViewGroup parent) 
            View view = super.getView(position, convertView, parent);
            TextView t1 = view.findViewById(android.R.id.text1);
            TextView t2 = view.findViewById(android.R.id.text2);

            String tS1 = copyData.get(position).fieldNames.get(position);
            t1.setText(tS1);

            String tS2 = String.valueOf(copyData.get(position).values.get(position));
            t2.setText(tS2);

            return view;
        
    ;
    holder.copyList.setAdapter(adapter);

当前行为:recyclerView 显示 3 个 ListViews,其中:

copyData0.fieldNames0 => “默认” copyData0.values0 => "假" copyData1.fieldNames1 => "Pont" copyData1.fieldNames1 => "9" copyData1.fieldNames1 => "entity_name" copyData1.fieldNames1 => "Analízis pontok"

我希望它如何工作RecyclerView 将显示与 copyData 大小一样多的列表(在本例中为 3),并且每个 ListView 将具有与其 @ 大小一样多的行数987654330@(现在是 5,但可以是其他)

编辑:

    String tS1 = copyData.get(holder.getAdapterPosition()).fieldNames.get(position);
    t1.setText(tS1);

    String tS2 = String.valueOf(copyData.get(holder.getAdapterPosition()).values.get(position));
    t2.setText(tS2);

现在我在 3 个单独的列表视图中获取 3 个单独的对象,但只有来自 fieldNamesvalues 的前 3 个值

编辑#2

    @Override
public void onBindViewHolder(final ViewHolder holder, final int position) 

    for (int i = 0;i<copyData.size();i++) 
        final List<String> names = copyData.get(i).fieldNames;
        final List<Object> values = copyData.get(i).values;

        //noinspection unchecked
        final ArrayAdapter adapter = new ArrayAdapter(mContext, android.R.layout.simple_list_item_2, android.R.id.text1, names) 
            @Override
            public View getView(int position, View convertView, ViewGroup parent) 
                View view = super.getView(position, convertView, parent);
                TextView t1 = view.findViewById(android.R.id.text1);
                TextView t2 = view.findViewById(android.R.id.text2);

                String tS1 = names.get(position);
                t1.setText(tS1);
                String tS2 = String.valueOf(values.get(position));
                t2.setText(tS2);

                return view;
            
        ;
        holder.copyList.setAdapter(adapter);
    

这样我可以将每个字段名-值对添加到列表中,但它的行为就像是超过了这两行final List<String> names = copyData.get(i).fieldNames; final List<Object> values = copyData.get(i).values; 3 次,然后在 3 个单独的 ListView 中显示最后一个对象的所有字段名值对

【问题讨论】:

【参考方案1】:

乍一看,我认为问题是

 String tS1 = copyData.get(position).fieldNames.get(position);

你在这里使用position,这是 Listview 的适配器位置。所以你的陈述应该

 String tS1 = copyData.get(Recycleview Adapter Position).fieldNames.get(Listview adapter position);

来自您的编辑:

现在我在 3 个单独的列表视图中获得了 3 个单独的对象,但是 只有前 3 个值

原因:

您的第一个适配器(Recyleview 适配器)只运行了 3 次。

如果我理解你的问题。你需要做这样的事情:

1) 使用 copyData 列表设置您的 Recycleview(您做得正确)。

2) 在您的回收视图的onBindViewHolder 中。生成 fieldNames 和 Values 的完整列表并设置您的 Listview 适配器

@Override
    public void onBindViewHolder(ViewHolder holder, final int position) 
    YourCustomeListViewAdapter adapter = new YourCustomeListViewAdapter(younewlistwithfieldNamesandvalue)
        holder.copyList.setAdapter(adapter);
    

编辑 2

您正在遍历 copyData 。这是错误的。

  for (int i = 0;i<copyData.size();i++) 

你需要遍历字段名和值数组。像这样

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) 
 for (int i = 0;i<copyData.get(position).fieldNames.size();i++) 
  
 for (int i = 0;i<copyData.get(position).values.size();i++) 
  

【讨论】:

Recycleview 适配器位置对我来说是“位置”,这段代码在我的“CopyRecyclerViewAdapter.java”文件中,但我真的不知道我应该如何获得适配器的位置。或者如果“位置”是 ListView 适配器的位置,那么我怎样才能得到 RecyclerView 的位置? @MátéAntal 你将Listview's Adapter 设置在RecycleView's adapter 中,对吗? 我需要一个完整的定制适配器吗?我不认为我知道如何编写自定义适配器。我不能在这里用 ArrayAdapter 做吗?另外,在每个 CopyModel 项目中,我有两个单独的列表,一个用于字段名,一个用于值。 如果我要“生成字段名称和值的完整列表”,那么它只会在一个列表视图中显示我的所有名称和值,对吧?我们不能这样做,重要的是 ListView 的数量应该与 copyData 的大小一样多 @MátéAntal 不,您不需要自定义适配器,但为了您的理解,我写了那个。 2)您可以生成一个带有(名称和值)的列表或两个单独的列表。它是您的选择。但逻辑保持不变

以上是关于在 RecyclerView 内的 ListViews 中显示项目的主要内容,如果未能解决你的问题,请参考以下文章

垂直 RecyclerView 内的水平 RecyclerView

android: ScrollView 内的 RecyclerView

E/RecyclerView:没有附加适配器;在片段内的recyclerview上跳过布局

在 RecyclerView 内的 ListViews 中显示项目

NestedScrollViewLayout 内的 SwipeRefreshLayout 内的 RecyclerView 无法滚动

recyclerview 内的 RecyclerView 只显示父 recyclerview 的最后一项