Search code examples
javaandroidandroid-recyclerviewtextview

Textview not displaying in the card view of Recycler View


I want to display a String of names in the text view of recycler view. the .xml of this step is below

<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>

the adapter class CustomAdapter is below

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

while the itemModel class is declared as:

package com.CurrentMediaPakLiveNews;

public class itemModel {
    String name;


    public String getName() {
        return name;
    }

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

}

the MainActivity declaration for textview is below:

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.YouTubeInitializationResult;
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);

the output is displaying everything except for the TEXTVIEW. no list is being displayed. I have tried ecery solution on stackoverflow regarding dependencies, class import etc but couldnt find any solution. Please can somebody help me in this as I am not a regular developer but a self learner.

My YoutubeVideoAdapter.java is below

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

Solution

  • You are applying differente adapters to the same recyclerview, which means the last one that will be visible will be the last one.

    You can see it here:

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

    If you notice, you are doing firstrecyclerView.setAdapter(adapterf) where you attach the CustomAdapter. Then, you do again firstrecyclerView.setAdapter(adapter) where you attach the YoutubeVideoAdapter. Only the last adapter will take place, since it overrides the previous one.

    EDIT:

    As I can understand, you want to render a view where you display an YoutubeThumbnail and a TextView underneath that thumbnail. In your CustomAdapter, you are using a list of itemModel. Consider adding an attribute to that itemModel that holds the Youtube video URL. If you do it this way, you can show the thumbnail and the TextView at the same time, you just need to modify your CustomAdapter to the same as your YoutubeVideoAdapter. I.e:

    Your ItemModel would look like this:

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

    And your CustomAdapter:

    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
    }
    

    This way you just need to use one adapter and one recyclerView with the code you've already done here:

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

    Let me know if it helped you!