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.