Android 在 ListView 中添加视图

3

我希望你能为我翻译一下如何在ListView的LinearLayout中添加Views?我想在ListView中显示一些额外的信息,并想要在for循环中通过项来添加它们。以下是我目前的代码:

Activity:

<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            android:scrollbars="vertical"
            android:layout_marginTop="0dp" />

</LinearLayout>

list_recycler:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:paddingRight="?android:attr/scrollbarSize">

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="15dp"
        android:layout_marginEnd="6dp"
        android:layout_marginTop="6dp"
        android:layout_marginBottom="6dp">

        <TextView android:id="@+id/list_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/textColor"
            android:textSize="16sp"
            android:layout_alignParentLeft="true"/>

        <TextView android:id="@+id/list_title_summary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/textColor"
            android:textSize="16sp"
            android:layout_alignParentLeft="true"/>


        <!-- VIEWS SHOULD BE ADDED HERE -->
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">

        </LinearLayout>

    </RelativeLayout>

</LinearLayout>

Adapter:

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.RecyclerViewHolder> {

    public static class RecyclerViewHolder extends RecyclerView.ViewHolder {

        TextView personName;
        TextView personAge;

        RecyclerViewHolder(View itemView) {
            super(itemView);
            personName = (TextView)itemView.findViewById(R.id.person_name);
            personAge = (TextView)itemView.findViewById(R.id.person_age);
        }
    }

    List<Items> list;

    public RVAdapter(List<Items> list){
        this.list = list;
    }

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_recycler, viewGroup, false);
        return new RecyclerViewHolder(v);
    }

    @Override
    public void onBindViewHolder(RecyclerViewHolder recyclerViewHolder, int i) {
        recyclerViewHolder.personName.setText(persons.get(i).name);
        recyclerViewHolder.personAge.setText(persons.get(i).age);
    }

    @Override
    public int getItemCount() {
        return persons.size();
    }
}

物品:

public class Items {
    String name;
    String age;

    public Items(String name, String age) {
        this.name = name;
        this.age = age;
    }
}

如何在ListView中的LinearLayout中添加视图?每个不同的ListView项目中的LinearLayout应包含不同的视图,因此它们不能全部相同。

我的数据将是什么样子:

ListView
    Entry1
        LinearLayout
            SubEntry1
            SubEntry2
            SubEntry3
    Entry2
        LinearLayout
            SubEntry1
            SubEntry2
            SubEntry3
    Entry3
        LinearLayout
            SubEntry1
            SubEntry2
            SubEntry3

所以Entry1..Entry3是ListViews,所有的子项应该是通过代码添加到相应ListView条目内部的LinearLayout中的TextView。

请查看下面的链接:https://dev59.com/VG855IYBdhLWcg3wGQNM - Anis LOUNIS aka AnixPasBesoin
1
如果你想在ListView自定义行中“添加”一个TextView,为什么不在布局中将其设置为android:visibility="gone"属性呢?然后在你的自定义适配器中选择要在其中可见的行并将其属性更改为'VIEW.VISIBLE'。 - Mark
因为我不知道有多少个TextView,因为数据从网络解析并且每天都会更改。 - Broadwell
我不知道会有多少个,这就是为什么我想通过编程创建它们,这样我就可以使用循环来遍历计数。 - Broadwell
请查看这个问题,您可以向ListView项中添加任意数量的子项。 - Jonas Czech
显示剩余3条评论
1个回答

3

给布局设置一个id,比如 @+id/item_content,然后在你的getView方法中进行如下操作:

itemContent = (LinearLayout)convertView.findViewById(R.id.item_content);
itemContent.removeAllViews();
//then you can add your views to the layouts depending on each item here using 
itemContent.addView(yourView);

您不能简单地循环遍历ListView项并向其添加内容。这就是我们使用适配器的原因。更新数据并通知适配器,数据已更改。
在这种情况下,我建议您使用RecyclerView编辑 您添加的不是数据结构,而是布局结构。无论如何,您应该有这个。
public class RowItem {
    private final String title;
    private final String desc;
    private ArrayList<String> contents;
}

然后你会做这个;

itemContent = (LinearLayout)convertView.findViewById(R.id.item_content);
itemContent.removeAllViews();
//then you can add your views to the layouts depending on each item here using 
for(String item : rowItem.getContents()){
    TextView textView = new TextView(parent.getContext());
    textView.setText(item);
    itemContent.addView(textView);
}

请阅读 RecyclerViewExpandableListView


请问您能否贴出更多的代码,以便我实现它? - Broadwell
@Broadwell,请告诉我们你的数据长什么样。 - Olayinka
我建议您在这种情况下使用RecyclerView。这个建议没有给出理由;你的回答同样适用于ListView:即,当数据被获取后,更新适配器。适配器应该构建每个项视图并根据请求位置处的项进行自定义。 - ataulm
我更新了问题,现在正在使用RecyclerView。 - Broadwell
我应该把这段代码放在哪里?在适配器中吗?还是在我将数据加载到适配器的地方? - Broadwell
@ataulm 我希望原帖作者能够了解RecyclerView。这只是一个建议,我并没有坚持要求。我给出的代码片段是基于ListView的。 - Olayinka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接