簡體   English   中英

在Recycler-view onBindViewHolder中處理空值的最佳技巧是什么?

[英]What is the best trick to handle null values in Recycler-view 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());

                }
            }

你也可以用這種方式對你有所幫助......請試試這個。

模型:

 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;
    }

}

編輯@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;
    }

}

如果您的字符串值為null,則返回“”。

希望這可以幫到你。

修改Model類的上述答案對我不起作用。

這就是我提出的

@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);

}

對於字符串值,你可以使用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);

但正如已經寫過的,你應該更好地創建綁定方法以獲得更清晰的代碼。 通常在Java項目中我使用ButterKnife並創建一些這樣的基類。

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:

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();
}

用法:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM