1

null/index-outof-bound 등과 관련하여 많은 예외를 처리했습니다. 그러나 이것이 if/else와 같이 가야 할 올바른 방법이 아니라고 생각합니다. 그래서 누구나 나를 안내 할 수 있습니다. 어떻게 onBindViewHolder의 모든 null 조건을 처리 할 수 ​​있습니까?BindViewHolder의 Recycler-view에서 null 값을 처리하는 가장 좋은 방법은 무엇입니까?

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

       } 
      } 
+0

이 백분율 클래스에서 하나의 일반적인 방법을 만들어 Util.checkNull 같은 당신의 변수의 값을 전달 (arr_custdetails.get (위치) .getFullName()); true 또는 false를 반환하면 true를 반환하고 그렇지 않으면 false를 반환합니다. 그렇지 않으면 문자열에서 얻은 값을 설정합니다. – Dilip

+0

ViewHolder 안에 함수를 추가하고 bind()를 호출하면 거기에서 코드를 조작하여 코드를 정리할 수 있습니다. –

답변

1

이 방법을 사용하면 도움이 될 것입니다. 시도해보십시오.

모델 :

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

} 
+0

나는 이것이 적절하지 않다고 생각한다. setter 메소드에서 null 체크를 추가하십시오. –

+0

이것은 대안 옵션입니다. 덧글을 달았습니다. 이미 제안한 내용 중 하나를 게시했습니다. – Dilip

1

편집 @dilip 답 : 귀하의 문자열 값이 null의 경우

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

} 

후 "반환".

희망이 도움이 될 수 있습니다. 문자열에 대한

+0

이것을 사용하여 여러 예외를 검사 할 수 있습니까? –

+0

@charisharma 원하는대로 설정 메소드를 변경할 수 있습니다. 배열 설정 메서드 에서처럼 크기를 확인할 수 있습니다. –

+0

실제로 데이터를 설정하지 않아도 gson을 사용하고 있으므로 get 메소드 만 사용하고 있습니다. –

0

는 안드로이드의 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 
    } 
} 
관련 문제