回收站视图的卡片视图中未显示Textview

时间:2020-08-26 09:42:56

标签: 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;
    }

}

textview的MainActivity声明如下:

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

输出显示除TEXTVIEW之外的所有内容。没有列表显示。我已经在有关依赖项,类导入等的stackoverflow上尝试了ecery解决方案,但是找不到任何解决方案。请问有人可以帮助我,因为我不是正规的开发人员,而是自学成才。

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

1 个答案:

答案 0 :(得分:1)

您正在将不同的适配器应用于同一recyclerview,这意味着最后一个可见的将是最后一个。

您可以在这里看到它:

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

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

如果您注意到,则说明您在firstrecyclerView.setAdapter(adapterf)上附加了CustomAdapter。然后,再次执行firstrecyclerView.setAdapter(adapter),在其中附加YoutubeVideoAdapter。因为最后一个适配器会覆盖前一个适配器,所以只会发生最后一个适配器。

编辑:

据我所知,您想渲染一个视图,在该视图中在该缩略图下方显示一个YoutubeThumbnail和一个TextView。在CustomAdapter中,您正在使用itemModel的列表。考虑将属性添加到保存YouTube视频URL的itemModel。如果这样做,则可以同时显示缩略图和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;
    }
}

和您的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
}

通过这种方式,您只需要使用一个适配器和一个recyclerView以及已在此处完成的代码:

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

让我知道它是否对您有帮助!