return 值显示变量在使用 if else 时可能尚未初始化
return value shows variable might not have been initialise while using if else
我正在使用回收器视图并创建一个流行的视频列表..我有 2 个 viewholder 1 用于 Photo 另一个用于 Video我使用此代码来区分照片和视频......但是当我 return 使用 if else 查看类型时,它显示它没有初始化......我该如何解决这个问题有什么新方法可以做到这一点。
这是我的头像
这是我的代码
public class Trending_adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int VIDEO_TYPE=0;
private static final int IMAGE_TYPE=1;
private LayoutInflater mInflater;
private VideoHolder mVideoHolder;
private PhotoHolder mPhotoHolder;
private int viewType;
class PhotoHolder extends RecyclerView.ViewHolder {
public PhotoHolder(View view){
super(view);
}
}
class VideoHolder extends RecyclerView.ViewHolder {
static final int LAYOUT_RES = R.layout.main_list;
private ExoPlayerViewHelper helper;
private CircleImageView profile_image;
//private String likeString;
public VideoHolder(View view) {
super(view);
}
}
public Trending_adapter(List<Photo> moviesList) {
this.moviesList = moviesList;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//findViewById...
mContext = parent.getContext();
switch (viewType) {
case VIDEO_TYPE:
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.video_type, parent, false);
mContext = parent.getContext();
return new VideoHolder(v);
case IMAGE_TYPE:
View i = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_list, parent, false);
mContext = parent.getContext();
return new PhotoHolder(i);
}
return null;
}
@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int position) {
// mHolder = holder;
// photo = getItem(position);
// photo = moviesList.get(holder.getAdapterPosition());
// final VideoHolder viewHolder2 = (VideoHolder)holder;
int viewType = getItemViewType(position);
switch ( viewType ) {
case IMAGE_TYPE:
break;
case VIDEO_TYPE:
break;
}
}
@Override
public int getItemCount() {
return moviesList.size();
}
@Override
public int getItemViewType ( int position ) {
int compare;
int viewType ;
if(moviesList.get(position).getPopularlist().contains("true")){
if (moviesList.get(position).getType_post().contains("Photo")) {
viewType = IMAGE_TYPE;
} else {
viewType = VIDEO_TYPE;
}
}
return viewType = over here it shows in red underline under view type;
}
public Photo getItem(int position) {
return moviesList.get(position);
这是因为您没有在 if 条件的错误情况下给出任何视图类型
if(moviesList.get(position).getPopularlist().contains("true"))
在getItemViewType
中用默认值初始化int viewType
。
int viewType = IMAGE_TYPE; // default view type
完整代码是
@Override
public int getItemViewType ( int position ) {
int compare;
int viewType = DEFAULT_TYPE; // provide a default view if all conditions fail
// rest of the code
return viewType;
}
只需在模型中添加另一个字段 class :
class Photo{
public static final int VIDEO_TYPE=1;
public static final int IMAGE_TYPE=2;
// your fileds
public int type;// ( update this field at the time of building your list
//apply your logic for differentciate VIDEO_TYPE & IMAGE_TYPE )
}
更新类型为 VIDEO_TYPE 或 IMAGE_TYPE;
public class Trending_adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
ArrayList<Photo> moviesList=new ArrayList<>();
public Trending_adapter(List<Photo> moviesList) {
this.moviesList = moviesList;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//findViewById...
mContext = parent.getContext();
switch (viewType) {
case Photo.VIDEO_TYPE:
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.video_type, parent, false);
mContext = parent.getContext();
return new VideoHolder(v);
case Photo.IMAGE_TYPE:
View i = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_list, parent, false);
mContext = parent.getContext();
return new PhotoHolder(i);
}
return null;
}
@Override
public int getItemViewType ( int position ) {
return moviesList.get(position).type;
}
@Override
public int getItemCount() {
return moviesList.size();
}
@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int position) {
Photo model=moviesList.get(position);
switch ( model.type ) {
case IMAGE_TYPE:
//do your stuff here for IMAGE_TYPE type
break;
case VIDEO_TYPE:
//do your stuff here for VIDEO_TYPE type
break;
}
}
class VideoHolder extends RecyclerView.ViewHolder {
static final int LAYOUT_RES = R.layout.main_list;
private ExoPlayerViewHelper helper;
private CircleImageView profile_image;
//private String likeString;
public VideoHolder(View view) {
super(view);
}
}
class PhotoHolder extends RecyclerView.ViewHolder {
public PhotoHolder(View view){
super(view);
}
}
}
It works fine for you.
我正在使用回收器视图并创建一个流行的视频列表..我有 2 个 viewholder 1 用于 Photo 另一个用于 Video我使用此代码来区分照片和视频......但是当我 return 使用 if else 查看类型时,它显示它没有初始化......我该如何解决这个问题有什么新方法可以做到这一点。
这是我的头像
public class Trending_adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int VIDEO_TYPE=0;
private static final int IMAGE_TYPE=1;
private LayoutInflater mInflater;
private VideoHolder mVideoHolder;
private PhotoHolder mPhotoHolder;
private int viewType;
class PhotoHolder extends RecyclerView.ViewHolder {
public PhotoHolder(View view){
super(view);
}
}
class VideoHolder extends RecyclerView.ViewHolder {
static final int LAYOUT_RES = R.layout.main_list;
private ExoPlayerViewHelper helper;
private CircleImageView profile_image;
//private String likeString;
public VideoHolder(View view) {
super(view);
}
}
public Trending_adapter(List<Photo> moviesList) {
this.moviesList = moviesList;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//findViewById...
mContext = parent.getContext();
switch (viewType) {
case VIDEO_TYPE:
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.video_type, parent, false);
mContext = parent.getContext();
return new VideoHolder(v);
case IMAGE_TYPE:
View i = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_list, parent, false);
mContext = parent.getContext();
return new PhotoHolder(i);
}
return null;
}
@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int position) {
// mHolder = holder;
// photo = getItem(position);
// photo = moviesList.get(holder.getAdapterPosition());
// final VideoHolder viewHolder2 = (VideoHolder)holder;
int viewType = getItemViewType(position);
switch ( viewType ) {
case IMAGE_TYPE:
break;
case VIDEO_TYPE:
break;
}
}
@Override
public int getItemCount() {
return moviesList.size();
}
@Override
public int getItemViewType ( int position ) {
int compare;
int viewType ;
if(moviesList.get(position).getPopularlist().contains("true")){
if (moviesList.get(position).getType_post().contains("Photo")) {
viewType = IMAGE_TYPE;
} else {
viewType = VIDEO_TYPE;
}
}
return viewType = over here it shows in red underline under view type;
}
public Photo getItem(int position) {
return moviesList.get(position);
这是因为您没有在 if 条件的错误情况下给出任何视图类型
if(moviesList.get(position).getPopularlist().contains("true"))
在getItemViewType
中用默认值初始化int viewType
。
int viewType = IMAGE_TYPE; // default view type
完整代码是
@Override
public int getItemViewType ( int position ) {
int compare;
int viewType = DEFAULT_TYPE; // provide a default view if all conditions fail
// rest of the code
return viewType;
}
只需在模型中添加另一个字段 class :
class Photo{
public static final int VIDEO_TYPE=1;
public static final int IMAGE_TYPE=2;
// your fileds
public int type;// ( update this field at the time of building your list
//apply your logic for differentciate VIDEO_TYPE & IMAGE_TYPE )
}
更新类型为 VIDEO_TYPE 或 IMAGE_TYPE;
public class Trending_adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
ArrayList<Photo> moviesList=new ArrayList<>();
public Trending_adapter(List<Photo> moviesList) {
this.moviesList = moviesList;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//findViewById...
mContext = parent.getContext();
switch (viewType) {
case Photo.VIDEO_TYPE:
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.video_type, parent, false);
mContext = parent.getContext();
return new VideoHolder(v);
case Photo.IMAGE_TYPE:
View i = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_list, parent, false);
mContext = parent.getContext();
return new PhotoHolder(i);
}
return null;
}
@Override
public int getItemViewType ( int position ) {
return moviesList.get(position).type;
}
@Override
public int getItemCount() {
return moviesList.size();
}
@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int position) {
Photo model=moviesList.get(position);
switch ( model.type ) {
case IMAGE_TYPE:
//do your stuff here for IMAGE_TYPE type
break;
case VIDEO_TYPE:
//do your stuff here for VIDEO_TYPE type
break;
}
}
class VideoHolder extends RecyclerView.ViewHolder {
static final int LAYOUT_RES = R.layout.main_list;
private ExoPlayerViewHelper helper;
private CircleImageView profile_image;
//private String likeString;
public VideoHolder(View view) {
super(view);
}
}
class PhotoHolder extends RecyclerView.ViewHolder {
public PhotoHolder(View view){
super(view);
}
}
}
It works fine for you.