[英]Why shows the RecyclerView no header if the ArrayList is empty?
我的RecyclerView
显示CardViews
和标题。 Cardviews
从json
获取值,而Header从之前的活动中给定参数获取值。
我的问题是,如果CardView
json
不为空,则Reyclerview
仅显示Header,但是如果json
没有向CardView
发送空值,则显示Header。
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;
}
}
}
同
@Override
public int getItemCount() {
if (!getDataAdapter.isEmpty()) {
return getDataAdapter.size() + 1;
} else
return getDataAdapter.size();
}
我尝试更改getDataAdapter
的大小(如果该getDataAdapter
为空仅用于显示Header),但它不起作用。
也有
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());
}
}
我试图更改final GetDataAdapter current = getItem(position);
的position
final GetDataAdapter current = getItem(position);
我认为有必要做类似position - 1
或类似的操作: size + 1
,因为Array
从0
开始计数, size
从1
开始计数。
也许您可以给我提示或解决我的问题。
假设您的列表getDataAdapter
为空。 然后, getDataAdapter.size() == 0
, getItemCount()
也返回0
。 由于您始终希望显示标题,因此getItemCount()
应该始终返回至少1
。 我将其重写为:
@Override
public int getItemCount() {
return getDataAdapter.size() + 1;
}
进行此更改后,RecyclerView列表中始终存在第零个项目。 调用getItemViewType()
,它将为该第零个项目正确返回TYPE_HEADER
,因此第零个项目的RecyclerView.ViewHolder
将为HeaderViewHolder
。 (我知道您曾说过一些有关在getDataAdapter
为空时更改其大小的getDataAdapter
,但这似乎是在此处实现目标的一种getDataAdapter
方式。无需更改数据模型即可容纳您的视图。)
关于onBindViewHolder()
:您不需要该嵌套的if-else语句。 由于标题始终位于RecyclerView列表的顶部,因此当RecyclerView绑定到第一个“常规”列表项时, position
参数将为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.