Динамическое добавление textview в 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 предметов из моих 3 TextView, а затем продолжает создавать новые карточки, содержащие до 3 предметов, чтобы показать мне остальные. Что я хотел бы сделать, так это использовать «временную шкалу» textview в качестве заголовка, а затем динамически добавлять контент для «заголовка» textview Только. Так, например, у меня может быть карта с 1 «временной шкалой» TextView, 0, 2, 5 и т. д. «название» TextView, 1 «веб-сайт» TextView

Это то, что можно сделать с помощью CardView? Если да, я был бы признателен за любые полезные указатели, которые помогут мне начать работу.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 161
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если я правильно понял вопрос, что вы хотите поставить динамически только часть данных. Таким образом, в держателе bindView привязывается только динамическая часть, которая является статической, которую вы можете жестко закодировать в файле xml со строковым значением.

Ответ принят как подходящий

Преобразуйте свой 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 добавьте динамические TextViews к заголовку:

   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();
    }

да, помогло спасибо! Просто краткое примечание для вашего примера, вам также нужно добавить частный заголовок LinearLayout;

Yasuo 23.06.2019 11:08

Другие вопросы по теме