【问题标题】:return value shows variable might not have been initialise while using if else返回值显示变量在使用 if else 时可能尚未初始化
【发布时间】:2018-12-09 09:12:16
【问题描述】:

我正在使用回收器视图并创建一个流行的视频列表..我有 2 个查看器 1 用于 Photo 另一个用于 Video 我使用此代码来区分照片和视频...但是当我使用 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);

【问题讨论】:

  • 为什么我只有这个返回视图类型的问题
  • 发布您的整个适配器代码
  • 好的,我会的......
  • 简单地将viewType设为全局变量
  • 请看一下这个

标签: android android-recyclerview return adapter


【解决方案1】:

这是因为您在 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;
}

【讨论】:

  • 这个 if(moviesList.get(position).getPopularlist().contains("true")) 不起作用
  • 无法正常工作?错误是什么?您需要提供默认视图类型以避免 变量未初始化 错误
  • 是的,我和你一样......你的代码是正确的,但如果条件失败我不想显示照片我该怎么做
  • 请告诉我..bro
  • 您可以提供另外一种视图类型,它显示当您在getItemViewType 中的所有条件都失败时通常会发生的任何错误信息。将其设为您的默认视图类型,或在 if 条件的 else 情况下返回它。此处显示编译器错误,因为您在 if 的 else 情况下没有给出任何视图类型@
【解决方案2】:

只需在模型类中添加另一个字段:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-25
    • 2015-07-04
    • 1970-01-01
    相关资源
    最近更新 更多