Textview не отображается в карточке просмотра Recycler View

#java #android #android-recyclerview #textview

#java #Android #android-recyclerview #textview

Вопрос:

Я хочу отобразить строку имен в текстовом представлении в режиме рециркуляции. .xml этого шага приведен ниже

 <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:id="@ id/youtube_row_card_view"
    android:layout_height="120dp"
    android:layout_marginLeft="1dp"
    android:layout_marginStart="1dp"
    android:layout_marginTop="0dp"
    android:layout_marginBottom="0dp"
    app:cardCornerRadius="10dp"
    app:contentPadding="4dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"

        android:orientation="vertical">

        <com.google.android.youtube.player.YouTubeThumbnailView
        android:id="@ id/video_thumbnail_image_view"
        android:layout_width="140dp"
        android:layout_height="90dp"
        android:contentDescription="@string/thumbnail_image_view_desc"
        android:scaleType="centerCrop" ></com.google.android.youtube.player.YouTubeThumbnailView>

        <TextView

            android:id="@ id/icon_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:textColor="@android:color/black"></TextView>

    </LinearLayout>
</androidx.cardview.widget.CardView>
  

класс адаптера CustomAdapter находится ниже

 package com.CurrentMediaPakLiveNews;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.viewHolder> {
    Context context;
    ArrayList<itemModel> items;


    public class viewHolder extends RecyclerView.ViewHolder {
        public TextView iconName;

        public viewHolder(View itemView) {
            super(itemView);
            this.iconName = itemView.findViewById(R.id.icon_name);

        }
    }

    public CustomAdapter(Context context, ArrayList<itemModel> items) {
        this.context = context;
        this.items = items;
    }

    @Override
    public viewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.youtube_video_custom_layout, parent, false);
        viewHolder viewHolder = new viewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(viewHolder holder, int position) {
        TextView iconName =holder.iconName;
        holder.iconName.setText(items.get(position).getName());
    }

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

в то время как класс ItemModel объявлен как:

 package com.CurrentMediaPakLiveNews;

public class itemModel {
    String name;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
  

объявление MainActivity для textview приведено ниже:

 import android.util.Log;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.initialization.InitializationStatus;
import com.google.android.gms.ads.initialization.OnInitializationCompleteListener;
import com.google.android.youtube.player.YouTubeInitializationResu<
import com.google.android.youtube.player.YouTubePlayer;
import com.google.android.youtube.player.YouTubePlayerSupportFragmentX;

import java.util.ArrayList;
import java.util.Collections;
import adapter.SecondYoutubeVideoAdapter;
import adapter.YoutubeVideoAdapter;
import utils.Constants;
import utils.RecyclerViewOnClickListener;
import utils.RecyclerViewOnClickListener2;

public class MainActivity extends AppCompatActivity {
    private AdView mAdView;
    private AdView mAdView2;
//custom adapter
    private static final String TAG = MainActivity.class.getSimpleName();
    private RecyclerView firstrecyclerView;
    private RecyclerView secondrecyclerView;
    ArrayList<itemModel> items;
    String[] iconName = {"GEo","Ary","Sama","Hum","dawn","gnn","aj","92","news1","neo"};

    //youtube player fragment
    private YouTubePlayerSupportFragmentX youTubePlayerFragment;
    private ArrayList<String> youtubeVideoArrayList;
    private ArrayList<String> secondyoutubeVideoArrayList;
    //youtube player to play video when new video selected
    private YouTubePlayer youTubePlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        generateDummyVideoList();
        initializeYoutubePlayer();
        setUpRecyclerView();
        populateRecyclerView();
private void setUpRecyclerView() {
        firstrecyclerView = findViewById(R.id.first_recycler_view);
        firstrecyclerView.setHasFixedSize(true);
        items = new ArrayList<>();

        //Horizontal direction recycler view
        LinearLayoutManager firstlinearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
        firstrecyclerView.setLayoutManager(firstlinearLayoutManager);
        firstrecyclerView.setItemAnimator(new DefaultItemAnimator());
       for (int i = 0; i < iconName.length; i  ) {
           itemModel itemModel = new itemModel();
            itemModel.setName(iconName[i]);
            items.add(itemModel);
        }

private void populateRecyclerView() {
        CustomAdapter adapterf = new CustomAdapter(this, items);
        firstrecyclerView.setAdapter(adapterf);

        final YoutubeVideoAdapter adapter = new YoutubeVideoAdapter(this, youtubeVideoArrayList);
        firstrecyclerView.setAdapter(adapter);
  

на выходе отображается все, кроме TEXTVIEW. список не отображается. Я попробовал решение ecery для stackoverflow в отношении зависимостей, импорта классов и т.д., Но не смог найти никакого решения. Пожалуйста, может кто-нибудь помочь мне в этом, поскольку я не обычный разработчик, а самообучающийся.

Мой YoutubeVideoAdapter.java ниже

 package adapter;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;

import com.google.android.youtube.player.YouTubeInitializationResu<
import com.google.android.youtube.player.YouTubeThumbnailLoader;
import com.google.android.youtube.player.YouTubeThumbnailView;
import com.CurrentMediaPakLiveNews.R;


import java.util.ArrayList;

import holder.YoutubeViewHolder;
import utils.Constants;

/**
 * Created by sonu on 10/11/17.
 */

public class YoutubeVideoAdapter extends RecyclerView.Adapter<YoutubeViewHolder> {
    private static final String TAG = YoutubeVideoAdapter.class.getSimpleName();
    private Context context;
    private ArrayList<String> youtubeVideoModelArrayList;

    //position to check which position is selected
    private int selectedPosition = 0;


    public YoutubeVideoAdapter(Context context, ArrayList<String> youtubeVideoModelArrayList) {
        this.context = context;
        this.youtubeVideoModelArrayList = youtubeVideoModelArrayList;
    }

    @Override
    public YoutubeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View view = layoutInflater.inflate(R.layout.youtube_video_custom_layout, parent, false);
        return new YoutubeViewHolder(view);
    }

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

        //if selected position is equal to that mean view is selected so change the cardview color
        if (selectedPosition == position) {
            holder.youtubeCardView.setCardBackgroundColor(ContextCompat.getColor(context, R.color.colorPrimary));
        } else {
            //if selected position is not equal to that mean view is not selected so change the cardview color to white back again
            holder.youtubeCardView.setCardBackgroundColor(ContextCompat.getColor(context, android.R.color.white));
        }

        /*  initialize the thumbnail image view , we need to pass Developer Key */
        holder.videoThumbnailImageView.initialize(Constants.DEVELOPER_KEY, new YouTubeThumbnailView.OnInitializedListener() {
            @Override
            public void onInitializationSuccess(YouTubeThumbnailView youTubeThumbnailView, final YouTubeThumbnailLoader youTubeThumbnailLoader) {
                //when initialization is sucess, set the video id to thumbnail to load
                youTubeThumbnailLoader.setVideo(youtubeVideoModelArrayList.get(position));

                youTubeThumbnailLoader.setOnThumbnailLoadedListener(new YouTubeThumbnailLoader.OnThumbnailLoadedListener() {
                    @Override
                    public void onThumbnailLoaded(YouTubeThumbnailView youTubeThumbnailView, String s) {
                        //when thumbnail loaded successfully release the thumbnail loader as we are showing thumbnail in adapter
                        youTubeThumbnailLoader.release();
                    }

                    @Override
                    public void onThumbnailError(YouTubeThumbnailView youTubeThumbnailView, YouTubeThumbnailLoader.ErrorReason errorReason) {
                        //print or show error when thumbnail load failed
                        Log.e(TAG, "Youtube Thumbnail Error");
                    }
                });
            }

            @Override
            public void onInitializationFailure(YouTubeThumbnailView youTubeThumbnailView, YouTubeInitializationResult youTubeInitializationResult) {
                //print or show error when initialization failed
                Log.e(TAG, "Youtube Initialization Failure");

            }
        });

    }

    @Override
    public int getItemCount() {
        return youtubeVideoModelArrayList != null ? youtubeVideoModelArrayList.size() : 0;
    }

    /**
     * method the change the selected position when item clicked
     * @param selectedPosition
     */
    public void setSelectedPosition(int selectedPosition) {
        this.selectedPosition = selectedPosition;
        //when item selected notify the adapter
        notifyDataSetChanged();
    }
}
  

Ответ №1:

Вы применяете разные адаптеры к одному и тому же recyclerview, что означает, что последний, который будет виден, будет последним.

Вы можете увидеть это здесь:

 CustomAdapter adapterf = new CustomAdapter(this, items);
    firstrecyclerView.setAdapter(adapterf);

final YoutubeVideoAdapter adapter = new YoutubeVideoAdapter(this, youtubeVideoArrayList);
    firstrecyclerView.setAdapter(adapter);
  

Если вы заметили, вы делаете firstrecyclerView.setAdapter(adapterf) то, куда вы прикрепляете пользовательский адаптер. Затем вы делаете это снова firstrecyclerView.setAdapter(adapter) , где вы прикрепляете YoutubeVideoAdapter. Будет использоваться только последний адаптер, поскольку он переопределяет предыдущий.

Редактировать:

Насколько я понимаю, вы хотите отобразить представление, в котором вы отображаете YoutubeThumbnail и TextView под этим эскизом. В вашем пользовательском адаптере вы используете список itemModel . Рассмотрите возможность добавления атрибута к тому, itemModel который содержит URL-адрес видео Youtube. Если вы сделаете это таким образом, вы сможете отображать миниатюру и TextView одновременно, вам просто нужно изменить свой CustomAdapter на тот же, что и ваш YoutubeVideoAdapter. То есть:

Ваша ItemModel будет выглядеть следующим образом:

 public class itemModel {
    String name;
    String youtubeUrl;

    public itemoModel(String name, String youtubeUrl){
        this.name = name;
        this.youtubeUrl = youtubeUrl;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getYoutubeUrl(){
        return this.youtubeUrl;
    }

    public void setYoutubeUrl(String youtubeUrl){
        this.youtubeUrl = youtubeUrl;
    }
}
  

И ваш пользовательский адаптер:

 public class viewHolder extends RecyclerView.ViewHolder {
    public TextView iconName;
    public YouTubeThumbnailView thumbnail;

    public viewHolder(View itemView) {
        super(itemView);
        this.iconName = itemView.findViewById(R.id.icon_name);
        this.thumbnail = itemView.findViewById(R.id.video_thumbnail_image_view);

    }
}

@Override
public void onBindViewHolder(viewHolder holder, int position) {
    TextView iconName =holder.iconName;
    holder.iconName.setText(items.get(position).getName());
    YouTubeThumbnailView thumbnail = holder.thumbnail;
    String youtubeUrl = items.get(position).getYoutubeUrl();
    //Do what you need to do with the youtubeUrl
}
  

Таким образом, вам просто нужно использовать один адаптер и один RecyclerView с кодом, который вы уже сделали здесь:

 CustomAdapter adapterf = new CustomAdapter(this, items);
firstrecyclerView.setAdapter(adapterf);
  

Дайте мне знать, помогло ли это вам!

Комментарии:

1. Как я могу применить обе функции с одним и тем же адаптером?

2. Я отредактировал свой ответ. Пожалуйста, взгляните и дайте мне знать, если вам это нужно / хотите

3. Строка youtubeUrl = items.get(position).getYoutubeUrl(); // Сделайте то, что вам нужно сделать с youtubeUrl На самом деле я хочу вручную добавить заголовки видео в текстовом представлении. Поскольку я закодировал программу таким образом, я не могу ее изменить. будет ли этот шаг » URL YouTube может автоматически указывать название этого видео? @Rodrigo Fernandes

4. Я добавил свой адаптер Youtube в вопрос. Пожалуйста, просмотрите его также @Rodrigo

5. Что вы подразумеваете под вручную? Позволить пользователю написать заголовок?