[英]What is the best trick to handle null values in Recycler-view onBindViewHolder?
I handled many exception regarding null/index-outof-bound etc. But i am thinking that this is not right way to go like if/else , so anyone can guide me How to handle all null condition in onBindViewHolder? 我处理了很多关于null / index-outof-bound等的异常。但我认为这不是正确的方式去if if,所以任何人都可以指导我如何处理onBindViewHolder中的所有空条件?
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
if (holder instanceof CustDtlsHolder)
{
// >i am getting here lots of null values below
if(position < arr_custdetails.size())
{
String dateInString = arr_custdetails.get(position).getLastVisitDate();
Date date = null;
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
try {
date = formatter.parse(dateInString);
SimpleDateFormat formatter2 = new SimpleDateFormat("dd/MMM/yyyy");
update_date = formatter2.format(date);
update_date = update_date.replace("/"," ");
} catch (ParseException e) {
e.printStackTrace();
} catch (NullPointerException e){
update_date="null";
}
//> same getting null values below as mention above.
((CustDtlsHolder) holder).txt_mbr_date.setText(update_date.substring(0,2));
((CustDtlsHolder) holder).txt_mbr_year.setText(update_date.substring(3,6)+ " "+update_date.substring(7,11));
((CustDtlsHolder) holder).txt_mbr_name.setText(arr_custdetails.get(position).getFullName());
((CustDtlsHolder) holder).txt_mbr_email.setText(arr_custdetails.get(position).getEmailAddress());
((CustDtlsHolder) holder).txt_mbr_phone.setText(arr_custdetails.get(position).getMobileNumber());
((CustDtlsHolder) holder).txt_mbr_avgSize_val.setText(""+Math.round(arr_custdetails.get(position).getAvgBasketVal())+" , "+Math.round(arr_custdetails.get(position).getAvgBasketQty())+" "+"Units");
if(arr_custdetails.get(position).getLast90dayVisit() == null || arr_custdetails.get(position).getLast90dayVisit().equals(""))
{
((CustDtlsHolder) holder).txt_mbr_avgVisits_val.setText("");
}
else
{
((CustDtlsHolder) holder).txt_mbr_avgVisits_val.setText(arr_custdetails.get(position).getLast90dayVisit()+ " in Last 90 days");
}
((CustDtlsHolder) holder).txt_mbr_noofvisit.setText(arr_custdetails.get(position).getMbrVisitCount());
}
}
you can use this way also it will be helpful for you...please try this. 你也可以用这种方式对你有所帮助......请试试这个。
model: 模型:
public class YourModelName{
private String mobileNumber="";
private String fullName="";
private String emailAddress="";
private String avgBasketVal="";
private String avgBasketQty="";
private String last90dayVisit="";
public String getMobileNumber() {
return mobileNumber;
}
public void setMobileNumber(String mobileNumber) {
this.mobileNumber = mobileNumber;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public String getEmailAddress() {
return emailAddress;
}
public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}
public String getAvgBasketVal() {
return avgBasketVal;
}
public void setAvgBasketVal(String avgBasketVal) {
this.avgBasketVal = avgBasketVal;
}
public String getAvgBasketQty() {
return avgBasketQty;
}
public void setAvgBasketQty(String avgBasketQty) {
this.avgBasketQty = avgBasketQty;
}
public String getLast90dayVisit() {
return last90dayVisit;
}
public void setLast90dayVisit(String last90dayVisit) {
this.last90dayVisit = last90dayVisit;
}
}
Edit @dilip answer: 编辑@dilip答案:
public class YourModelName{
private String mobileNumber="";
private String fullName="";
private String emailAddress="";
private String avgBasketVal="";
private String avgBasketQty="";
private String last90dayVisit="";
public String getMobileNumber() {
return mobileNumber;
}
public void setMobileNumber(String mobileNumber) {
if(mobileNumber != null)
this.mobileNumber = mobileNumber;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
if(fullName != null)
this.fullName = fullName;
}
public String getEmailAddress() {
return emailAddress;
}
public void setEmailAddress(String emailAddress) {
if(emailAddress != null)
this.emailAddress = emailAddress;
}
public String getAvgBasketVal() {
return avgBasketVal;
}
public void setAvgBasketVal(String avgBasketVal) {
if(avgBasketVal != null)
this.avgBasketVal = avgBasketVal;
}
public String getAvgBasketQty() {
return avgBasketQty;
}
public void setAvgBasketQty(String avgBasketQty) {
if(avgBasketQty != null)
this.avgBasketQty = avgBasketQty;
}
public String getLast90dayVisit() {
return last90dayVisit;
}
public void setLast90dayVisit(String last90dayVisit) {
if(last90dayVisit != null)
this.last90dayVisit = last90dayVisit;
}
}
If your string value is null then return "". 如果您的字符串值为null,则返回“”。
Hope this may help you. 希望这可以帮到你。
Above answer which modifies the Model class didn't work for me. 修改Model类的上述答案对我不起作用。
This is what I came up with 这就是我提出的
@Override
public void onBindViewHolder(HomeViewHolder holder, int position)
{
String title;
try {
title = myList.get(position).getTitle();
} catch (NullPointerException e) {
title = "Null";
}
holder.tvTitle.setText(title);
}
For string values you can use android's TextUtils, and fyi you can even set null in textView.setText() method: 对于字符串值,你可以使用android的TextUtils,你甚至可以在textView.setText()方法中设置null:
CustDtlsHolder custDtlsHolder = ((CustDtlsHolder) holder);
String value = arr_custdetails.get(position).getLast90dayVisit();
if (!TextUtils.isEmpty(value) {
value += " in Last 90 days";
}
custDtlsHolder.txt_mbr_avgVisits_val.setText(value);
But as has been written, you should better create bind method for clearer code. 但正如已经写过的,你应该更好地创建绑定方法以获得更清晰的代码。 Usually in Java projects I use ButterKnife and create some base classes like that. 通常在Java项目中我使用ButterKnife并创建一些这样的基类。
BaseRecyclerAdapter: BaseRecyclerAdapter:
public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<BaseViewHolder> {
private List<T> items;
private OnRecyclerItemClickListener<T> onRecyclerItemClickListener;
public BaseRecyclerAdapter(List<T> items) {
this.items = items;
}
@Override public void onBindViewHolder(BaseViewHolder holder, int position) {
T item = getItem(position);
holder.bind(item);
holder.itemView.setOnClickListener(v -> {
if (onRecyclerItemClickListener != null) {
onRecyclerItemClickListener.onItemClick(this, item);
}
});
}
protected final View getViewHolderView(ViewGroup parent, @LayoutRes int itemLayoutId) {
return LayoutInflater.from(parent.getContext()).inflate(itemLayoutId, parent, false);
}
// ... other base methods such as getItemCount(), setItems, etc.
BaseViewHolder: BaseViewHolder:
public abstract class BaseViewHolder<T> extends RecyclerView.ViewHolder {
protected abstract void bind(T item);
public BaseViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
public final Context getContext() {
return itemView.getContext();
}
And usage: 用法:
final class MyAdapter extends BaseRecyclerAdapter<MyItem> {
MyAdapter(List<MyItem> items) { super(items); }
@Override public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new MyViewHolder(getViewHolderView(parent, R.layout.item));
}
class MyViewHolder extends BaseViewHolder<MyItem> {
@BindView(R.id.txt_date) TextView txtDate;
MyViewHolder(View itemView) { super(itemView); }
@Override protected void bind(MyItem item) {
txtDate.setText(getContext().getString(R.string.item_created, DateTimeUtils.formatDate(item.date)));
// put your null checking here
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.