[英]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.