简体   繁体   中英

Why shows the RecyclerView no header if the ArrayList is empty?

My RecyclerView displays CardViews and a Header. The Cardviews get values from json and the Header gets values from given parameters in the activity before.

My problem is that the Reyclerview only displays the Header if json for the CardView is not empty, but if json sends no empty values to CardView the Header is shown.

RecyclerViewAdapter :

        public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

            Context context;

            private Activity activity;

            List<GetDataAdapter> getDataAdapter;
            List<ExerciseAdapter> exerciseAdapter;
            private static final int TYPE_HEADER = 0;

            private static final int TYPE_ITEM = 1;
            public RecyclerViewAdapter(Context context, List<GetDataAdapter> getDataAdapter, List<ExerciseAdapter> exerciseAdapter){

                super();

                this.exerciseAdapter = exerciseAdapter;
                this.getDataAdapter = getDataAdapter;
                this.context = context;
            }

            private GetDataAdapter getItem(int position)
            {
                return getDataAdapter.get(position);

            }


            @Override
            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                if (viewType == TYPE_ITEM) {
                     View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
                     return new ViewHolder(itemView);
                }
                if (viewType == TYPE_HEADER) {
                    //Inflating header view
                    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.header, parent, false);
                    return new HeaderViewHolder(itemView);
                }
                return null;
            }



            class ViewHolder extends RecyclerView.ViewHolder{

                public TextView edit;
                public TextView NameTextView;
                public TextView PhoneNumberTextView;
                public TextView SubjectTextView;
                public NetworkImageView imageView1;
                public NetworkImageView imageView2;
                public NetworkImageView imageView3;
                public NetworkImageView imageView4;
                public NetworkImageView imageView5;
                public TextView ratebutton;


                public ViewHolder(View itemView) {

                    super(itemView);
                    edit = (TextView)itemView.findViewById(R.id.edit);
                    NameTextView = (TextView) itemView.findViewById(R.id.textView4) ;
                    PhoneNumberTextView = (TextView) itemView.findViewById(R.id.textView6) ;
                    SubjectTextView = (TextView) itemView.findViewById(R.id.textView8) ;
                    imageView1 = (NetworkImageView)itemView.findViewById(R.id.imageView1t);
                    imageView2 = (NetworkImageView)itemView.findViewById(R.id.imageView2t);
                    imageView3 = (NetworkImageView)itemView.findViewById(R.id.imageView3t);
                    imageView4 = (NetworkImageView)itemView.findViewById(R.id.imageView4t);
                    imageView5 = (NetworkImageView)itemView.findViewById(R.id.imageView5t);
                    ratebutton = (TextView)itemView.findViewById(R.id.ratebutton);



                }
            }



            @Override
            public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
                if (holder instanceof ViewHolder) {

                    if (position != 0) {
                      final GetDataAdapter current = getItem(position - 1);


                        final ViewHolder holder1 = (ViewHolder) holder;
                        final ImageLoader imageLoader = ImageAdapter.getInstance(context).getImageLoader();
                        final ImageLoader imageLoader2 = ImageAdapter.getInstance(context).getImageLoader();
                        final ImageLoader imageLoader3 = ImageAdapter.getInstance(context).getImageLoader();
                        final ImageLoader imageLoader4 = ImageAdapter.getInstance(context).getImageLoader();
                        final ImageLoader imageLoader5 = ImageAdapter.getInstance(context).getImageLoader();

                        imageLoader.get(current.getImageUrl(),
                                ImageLoader.getImageListener(
                                        holder1.imageView1,
                                        R.mipmap.ic_launcher_image,
                                        android.R.drawable.ic_dialog_alert
                                )
                        );
                        imageLoader2.get(current.getImageUrl2(),
                                ImageLoader.getImageListener(
                                        holder1.imageView2,
                                        R.mipmap.ic_launcher_image,
                                        android.R.drawable.ic_dialog_alert
                                )
                        );
                        imageLoader3.get(current.getImageUrl3(),
                                ImageLoader.getImageListener(
                                        holder1.imageView3,
                                        R.mipmap.ic_launcher_image,
                                        android.R.drawable.ic_dialog_alert
                                )
                        );
                        imageLoader4.get(current.getImageUrl4(),
                                ImageLoader.getImageListener(
                                        holder1.imageView4,
                                        R.mipmap.ic_launcher_image,
                                        android.R.drawable.ic_dialog_alert
                                )
                        );
                        imageLoader5.get(current.getImageUrl5(),
                                ImageLoader.getImageListener(
                                        holder1.imageView5,
                                        R.mipmap.ic_launcher_image,
                                        android.R.drawable.ic_dialog_alert
                                )
                        );


                        holder1.imageView1.setImageUrl(current.getImageUrl(), imageLoader);
                        holder1.imageView2.setImageUrl(current.getImageUrl2(), imageLoader2);
                        holder1.imageView3.setImageUrl(current.getImageUrl3(), imageLoader3);
                        holder1.imageView4.setImageUrl(current.getImageUrl4(), imageLoader4);
                        holder1.imageView5.setImageUrl(current.getImageUrl5(), imageLoader5);
                        holder1.NameTextView.setText(current.getName());
                        holder1.PhoneNumberTextView.setText(current.getPhone_number());
                        holder1.SubjectTextView.setText(current.getSubject2());



                    } else{
                        final GetDataAdapter current = getItem(position);
                        final ViewHolder holder1 = (ViewHolder) holder;
                        final ImageLoader imageLoader = ImageAdapter.getInstance(context).getImageLoader();
                        final ImageLoader imageLoader2 = ImageAdapter.getInstance(context).getImageLoader();
                        final ImageLoader imageLoader3 = ImageAdapter.getInstance(context).getImageLoader();
                        final ImageLoader imageLoader4 = ImageAdapter.getInstance(context).getImageLoader();
                        final ImageLoader imageLoader5 = ImageAdapter.getInstance(context).getImageLoader();

                        imageLoader.get(current.getImageUrl(),
                                ImageLoader.getImageListener(
                                        holder1.imageView1,
                                        R.mipmap.ic_launcher_image,
                                        android.R.drawable.ic_dialog_alert
                                )
                        );
                        imageLoader2.get(current.getImageUrl2(),
                                ImageLoader.getImageListener(
                                        holder1.imageView2,
                                        R.mipmap.ic_launcher_image,
                                        android.R.drawable.ic_dialog_alert
                                )
                        );
                        imageLoader3.get(current.getImageUrl3(),
                                ImageLoader.getImageListener(
                                        holder1.imageView3,
                                        R.mipmap.ic_launcher_image,
                                        android.R.drawable.ic_dialog_alert
                                )
                        );
                        imageLoader4.get(current.getImageUrl4(),
                                ImageLoader.getImageListener(
                                        holder1.imageView4,
                                        R.mipmap.ic_launcher_image,
                                        android.R.drawable.ic_dialog_alert
                                )
                        );
                        imageLoader5.get(current.getImageUrl5(),
                                ImageLoader.getImageListener(
                                        holder1.imageView5,
                                        R.mipmap.ic_launcher_image,
                                        android.R.drawable.ic_dialog_alert
                                )
                        );


                        holder1.imageView1.setImageUrl(current.getImageUrl(), imageLoader);
                        holder1.imageView2.setImageUrl(current.getImageUrl2(), imageLoader2);
                        holder1.imageView3.setImageUrl(current.getImageUrl3(), imageLoader3);
                        holder1.imageView4.setImageUrl(current.getImageUrl4(), imageLoader4);
                        holder1.imageView5.setImageUrl(current.getImageUrl5(), imageLoader5);
                        holder1.NameTextView.setText(current.getName());
                        holder1.PhoneNumberTextView.setText(current.getPhone_number());
                        holder1.SubjectTextView.setText(current.getSubject2());


                    }
                }
                if (holder instanceof HeaderViewHolder) {
                    final GetDataAdapter current = getItem(position);
                    final HeaderViewHolder holder1 = (HeaderViewHolder) holder;

                    //set text of header textviews;



                }

            }



            @Override
            public int getItemViewType(int position) {
                if (position == 0) {
                    return TYPE_HEADER;
                }
                    return TYPE_ITEM;

        }


            @Override
            public int getItemCount() {
               if (!getDataAdapter.isEmpty()) {
                   return getDataAdapter.size() + 1;
               } else

                   return getDataAdapter.size();

            }
            private class HeaderViewHolder extends RecyclerView.ViewHolder {
                TextView //some Textviews for Header;
                ImageView exerciseimage;

                public HeaderViewHolder(View view) {
                    super(view);


                  // declaring textviews;



                }
            }




        }

With

@Override
        public int getItemCount() {
           if (!getDataAdapter.isEmpty()) {
               return getDataAdapter.size() + 1;
           } else

               return getDataAdapter.size();

        }

I tried to change the size of getDataAdapter if it's empty for showing only the Header, but it doesn't work.

Also with

else{
                    final GetDataAdapter current = getItem(position);
                    final ViewHolder holder1 = (ViewHolder) holder;
                    final ImageLoader imageLoader = ImageAdapter.getInstance(context).getImageLoader();
                    final ImageLoader imageLoader2 = ImageAdapter.getInstance(context).getImageLoader();
                    final ImageLoader imageLoader3 = ImageAdapter.getInstance(context).getImageLoader();
                    final ImageLoader imageLoader4 = ImageAdapter.getInstance(context).getImageLoader();
                    final ImageLoader imageLoader5 = ImageAdapter.getInstance(context).getImageLoader();

                    imageLoader.get(current.getImageUrl(),
                            ImageLoader.getImageListener(
                                    holder1.imageView1,
                                    R.mipmap.ic_launcher_image,
                                    android.R.drawable.ic_dialog_alert
                            )
                    );
                    imageLoader2.get(current.getImageUrl2(),
                            ImageLoader.getImageListener(
                                    holder1.imageView2,
                                    R.mipmap.ic_launcher_image,
                                    android.R.drawable.ic_dialog_alert
                            )
                    );
                    imageLoader3.get(current.getImageUrl3(),
                            ImageLoader.getImageListener(
                                    holder1.imageView3,
                                    R.mipmap.ic_launcher_image,
                                    android.R.drawable.ic_dialog_alert
                            )
                    );
                    imageLoader4.get(current.getImageUrl4(),
                            ImageLoader.getImageListener(
                                    holder1.imageView4,
                                    R.mipmap.ic_launcher_image,
                                    android.R.drawable.ic_dialog_alert
                            )
                    );
                    imageLoader5.get(current.getImageUrl5(),
                            ImageLoader.getImageListener(
                                    holder1.imageView5,
                                    R.mipmap.ic_launcher_image,
                                    android.R.drawable.ic_dialog_alert
                            )
                    );


                    holder1.imageView1.setImageUrl(current.getImageUrl(), imageLoader);
                    holder1.imageView2.setImageUrl(current.getImageUrl2(), imageLoader2);
                    holder1.imageView3.setImageUrl(current.getImageUrl3(), imageLoader3);
                    holder1.imageView4.setImageUrl(current.getImageUrl4(), imageLoader4);
                    holder1.imageView5.setImageUrl(current.getImageUrl5(), imageLoader5);
                    holder1.NameTextView.setText(current.getName());
                    holder1.PhoneNumberTextView.setText(current.getPhone_number());
                    holder1.SubjectTextView.setText(current.getSubject2());


                }
            }

I tried to change the position in final GetDataAdapter current = getItem(position); I think it's necessary to do something like this position - 1 or like: size + 1 , because an Array starts counting at 0 and size at 1 .

Maybe you can give me a hint or solve my problem.

Suppose your list, getDataAdapter , is empty. Then getDataAdapter.size() == 0 and getItemCount() also returns 0 . Since you always want the header to show, getItemCount() should always return at least 1 . I would rewrite it as simply:

@Override
public int getItemCount() {
    return getDataAdapter.size() + 1;
}

With that change, there is always a zeroth item in the RecyclerView list. When getItemViewType() is called, it will correctly return TYPE_HEADER for that zeroth item, and so the RecyclerView.ViewHolder of the zeroth item will be a HeaderViewHolder . (I know that you said something about changing the size of getDataAdapter when it's empty, but that seems like a roundabout way of accomplishing the goal here. Your data model shouldn't need to change to accommodate your view.)

Regarding onBindViewHolder() : You don't need that nested if-else statement. Since the header is always at the top of the RecyclerView list, the position parameter will be 1 when the RecyclerView binds to the first "normal" list item. But the first normal item corresponds to the zeroth item in getDataAdapter , so subtract 1 :

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
    if (holder instanceof ViewHolder) {
        final ViewHolder viewHolder = (ViewHolder) holder;
        final GetDataAdapter current = getItem(position - 1);
        //bind to normal views
    } else if (holder instanceof HeaderViewHolder) {
        final HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder;
        //set text of header textviews
    }
}

错误是,如果响应为空,我忘记设置适配器。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM