将文本视图动态添加到CardView

时间:2019-06-21 19:23:14

标签: java android textview android-cardview

因此,我具有如下创建的卡片视图:

    <?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="5dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/timeline"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp" />
         <TextView
            android:id="@+id/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:textStyle="bold" />
        <TextView
            android:id="@+id/website"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp" />
    </LinearLayout>

在我的适配器类中,我具有以下代码来填充卡视图。

public class MyViewHolder extends RecyclerView.ViewHolder {

        private TextView tv_title, tv_timeline, tv_website;

        public MyViewHolder(View view) {
            super(view);
            tv_title = (TextView) view.findViewById(R.id.title);
            tv_timeline = (TextView) view.findViewById(R.id.timeline);
            tv_website = (TextView) view.findViewById(R.id.website);
        }
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.activity_row_data, parent, false);

        return new MyViewHolder(itemView);
    }

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

            holder.tv_title.setText(mTitleList.get(position));                
      holder.tv_timeline.setText(mtimelineList.get(position));
            holder.tv_website.setText(mSiteSrc.get(position));

    }

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

这正确地显示了我期望的输出。问题是,CardView最多只能向我显示3个TextView中的3个项目,然后继续创建更多卡片,最多可以显示3个项目来向我显示其余的项目。  我想做的是使用textview“时间轴”作为标题,然后动态地仅为添加textview“ title”的内容。因此,例如,我可能有一张卡片,其中包含1个“时间轴” TextView,0、2、5等“标题” TextView,1个“网站” TextView

这是CardView可以完成的吗?如果是的话,我将不胜感激任何帮助我入门的有用指示。

2 个答案:

答案 0 :(得分:0)

如果我理解正确,那么您只想动态放置部分数据的问题。因此,在bindView Holder中,仅绑定静态的动态部分,您可以使用字符串值将其硬编码到xml文件中。

答案 1 :(得分:0)

转换您的xml:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/timeline"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp" />
     <LienarLayout
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:orientation="vertical"/>
    <TextView
        android:id="@+id/website"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp" />
</LinearLayout>

现在在您的onBindViewHolder中将动态TextView添加到标题:

   public class MyViewHolder extends RecyclerView.ViewHolder {

        private TextView tv_timeline, tv_website;
        private LinearLayout title; 

        public MyViewHolder(View view) {
            super(view);
            title = (LinearLayout) view.findViewById(R.id.title);
            tv_timeline = (TextView) view.findViewById(R.id.timeline);
            tv_website = (TextView) view.findViewById(R.id.website);
        }
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.activity_row_data, parent, false);

        return new MyViewHolder(itemView);
    }

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

      holder.tv_timeline.setText(mtimelineList.get(position));
      holder.tv_website.setText(mSiteSrc.get(position));
      for(int i = 0; i < 5; i++) { // 5 is the count how many times you want to add textview
          LayoutParams lparams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
          TextView tv=new TextView(holder.title.getContext());
          tv.setLayoutParams(lparams);
          tv.setText("test = "+i);
          holder.title.addView(tv);
}

    }

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