简体   繁体   English

如果ArrayList为空,为什么不显示RecyclerView没有标题?

[英]Why shows the RecyclerView no header if the ArrayList is empty?

My RecyclerView displays CardViews and a Header. 我的RecyclerView显示CardViews和标题。 The Cardviews get values from json and the Header gets values from given parameters in the activity before. Cardviewsjson获取值,而Header从之前的活动中给定参数获取值。

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. 我的问题是,如果CardView json不为空,则Reyclerview仅显示Header,但是如果json没有向CardView发送空值,则显示Header。

RecyclerViewAdapter : 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. 我尝试更改getDataAdapter的大小(如果该getDataAdapter为空仅用于显示Header),但它不起作用。

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); 我试图更改final GetDataAdapter current = getItem(position);position 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 . 我认为有必要做类似position - 1或类似的操作: size + 1 ,因为Array0开始计数, size1开始计数。

Maybe you can give me a hint or solve my problem. 也许您可以给我提示或解决我的问题。

Suppose your list, getDataAdapter , is empty. 假设您的列表getDataAdapter为空。 Then getDataAdapter.size() == 0 and getItemCount() also returns 0 . 然后, getDataAdapter.size() == 0getItemCount()也返回0 Since you always want the header to show, getItemCount() should always return at least 1 . 由于您始终希望显示标题,因此getItemCount()应该始终返回至少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. 进行此更改后,RecyclerView列表中始终存在第零个项目。 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 . 调用getItemViewType() ,它将为该第零个项目正确返回TYPE_HEADER ,因此第零个项目的RecyclerView.ViewHolder将为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.) (我知道您曾说过一些有关在getDataAdapter为空时更改其大小的getDataAdapter ,但这似乎是在此处实现目标的一种getDataAdapter方式。无需更改数据模型即可容纳您的视图。)

Regarding onBindViewHolder() : You don't need that nested if-else statement. 关于onBindViewHolder() :您不需要该嵌套的if-else语句。 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. 由于标题始终位于RecyclerView列表的顶部,因此当RecyclerView绑定到第一个“常规”列表项时, position参数将为1 But the first normal item corresponds to the zeroth item in getDataAdapter , so subtract 1 : 但是第一个普通项目对应于getDataAdapter的第零个项目,因此减去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
    }
}

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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