2015-03-28 3 views
0

я понял, как настроить RecyclerView.Adapter с несколькими ViewHolders за то, что им хочет сделать, но я не могу понять, как показывают многочисленные CardView макеты в одном Activity или Fragment. В макете CardView s всегда отображается onr для последнего набора информации, полученной в базе данных. Есть ли способ иметь несколько макетов для CardView s в одном Fragment?несколько макетов cardview в одном recyclerview в фрагменте

Edit: Вот мой адаптер

общественного класса TimeCardAdapter расширяет RecyclerView.Adapter {

private ArrayList<ChecksGetterSetter> checksList = new ArrayList<>(); 

    private static final int TYPE_CHECKS = 0; 
    private static final int TYPE_CHECKINFO = 1; 

    public class ViewHolder extends RecyclerView.ViewHolder { 
     public ViewHolder(View itemView) { 
      super(itemView); 
     } 
    } 

    public class ChecksViewHolder extends ViewHolder { 
     @InjectView(R.id.CCtextviewDate) TextView tvcPayPeriod; 
     @InjectView(R.id.CCtextviewHoursInfo) TextView tvcHours; 
     @InjectView(R.id.CCtextviewOvertimeHours) TextView cOTHours; 
     @InjectView(R.id.CCtextviewOvertimeHoursInfo) TextView tvcOTHours; 
     @InjectView(R.id.CCtextviewPayInfo) TextView tvcRate; 
     @InjectView(R.id.CCtextviewOvertimePay) TextView cOTRate; 
     @InjectView(R.id.CCtextviewOvertimePayInfo) TextView tvcOTRate; 
     @InjectView(R.id.CCtextviewGrossPayInfo) TextView tvcGrossPay; 
     @InjectView(R.id.CCtextviewAfterTaxInfo) TextView tvcAfterTax; 

     public ChecksViewHolder(View itemView) { 
      super(itemView); 
      ButterKnife.inject(this, itemView); 
     } 
    } 

    public class CheckInfoViewHolder extends ViewHolder { 
     @InjectView(R.id.CCItextviewSocialSecurityInfo) TextView tvSocialSecurity; 
     @InjectView(R.id.CCItextviewMedicareInfo) TextView tvMedicare; 
     @InjectView(R.id.CCItextviewFederalIncomeTaxInfo) TextView tvFederalIncomeTax; 
     @InjectView(R.id.CCItextviewAllowancesInfo) TextView tvAllowances; 
     @InjectView(R.id.CCItextviewDeductions) TextView deductions; 
     @InjectView(R.id.CCItextviewDeductionsInfo) TextView tvDeductions; 

     public CheckInfoViewHolder(View itemView) { 
      super(itemView); 
      ButterKnife.inject(this, itemView); 
     } 
    } 

    @Override 
    public int getItemViewType(int position) { 
     int viewType; 
     if(checksList.get(position).getPeriodStart() != null){ 
      viewType = TYPE_CHECKS; 
     } else { 
      viewType = TYPE_CHECKINFO; 
     } 
     return viewType; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
     LayoutInflater mInflater = LayoutInflater.from(viewGroup.getContext()); 
     switch (viewType) { 
      case TYPE_CHECKS: 
       ViewGroup vgChecks = (ViewGroup) mInflater.inflate(R.layout.cardview_checks, viewGroup, false); 
       return new ChecksViewHolder(vgChecks); 
      case TYPE_CHECKINFO: 
       ViewGroup vgCheckInfo = (ViewGroup) mInflater.inflate(R.layout.cardview_check_info, viewGroup, false); 
       return new CheckInfoViewHolder(vgCheckInfo); 
      default: 
       ViewGroup vgTimeCard1 = (ViewGroup) mInflater.inflate(R.layout.cardview_checks, viewGroup, false); 
       return new ChecksViewHolder(vgTimeCard1); 
     } 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder viewHolder, int position) { 
     switch (viewHolder.getItemViewType()) { 

      case TYPE_CHECKS: 
       ChecksViewHolder holder = (ChecksViewHolder) viewHolder; 
       ChecksGetterSetter pos = checksList.get(position); 

       if (pos.getPeriodEnd().equals("") || pos.getPeriodEnd() == null) { 
        holder.tvcPayPeriod.setText(pos.getPeriodStart()); 
       } else { 
        holder.tvcPayPeriod.setText(pos.getPeriodStart() + " - " + pos.getPeriodEnd()); 
       } 
       holder.tvcHours.setText(pos.getHours()); 
       if (!pos.getOtHours().equals("0.0")) { 
        holder.tvcOTHours.setText(pos.getOtHours()); 
       } else { 
        holder.cOTHours.setVisibility(View.GONE); 
        holder.tvcOTHours.setVisibility(View.GONE); 
       } 
       holder.tvcRate.setText(pos.getRate()); 
       if (!pos.getOtRate().equals("$0.00")) { 
        holder.tvcOTRate.setText(pos.getOtRate()); 
       } else { 
        holder.cOTRate.setVisibility(View.GONE); 
        holder.tvcOTRate.setVisibility(View.GONE); 
       } 
       holder.tvcGrossPay.setText(pos.getGrossPay()); 
       holder.tvcAfterTax.setText(pos.getAfterTax()); 
       break; 

      case TYPE_CHECKINFO: 
       CheckInfoViewHolder infoHolder = (CheckInfoViewHolder) viewHolder; 
       ChecksGetterSetter posi = checksList.get(position); 

       infoHolder.tvSocialSecurity.setText(posi.getSocialSecurity()); 
       infoHolder.tvMedicare.setText(posi.getMedicare()); 
       infoHolder.tvFederalIncomeTax.setText(posi.getFederalIncomeTax()); 
       infoHolder.tvAllowances.setText(posi.getAllowances()); 
       if (!posi.getDeductions().equals("$0.00")) { 
        infoHolder.tvDeductions.setText(posi.getDeductions()); 
       } else { 
        infoHolder.deductions.setVisibility(View.GONE); 
        infoHolder.tvDeductions.setVisibility(View.GONE); 
       } 
       break; 
     } 
    } 

    @Override 
    public int getItemCount() { 
     return checksList.size(); 
    } 

    public ChecksGetterSetter getItem(int position){ 
     return checksList.get(position); 
    } 

    public void addItem(ChecksGetterSetter check) { 
     checksList.add(check); 
     notifyItemInserted(checksList.size() - 1); 
    } 

    public void deleteItem(int index){ 
     checksList.remove(index); 
     notifyItemRemoved(index); 
    } 

    public TimeCardAdapter(List<ChecksGetterSetter> check) { 
     if(check == null){ 
      throw new IllegalArgumentException("check must not be null"); 
     } 
     this.checksList = new ArrayList<>(check); 
    } 
} 

здесь информация я хочу, чтобы заполнить каждый из ViewHolders с

private void getCheckInfo() { 
     if (checkCursor.getCount() != 0) { 
      while (checkCursor.moveToNext()) { 
       hours = checkCursor.getDouble(checkCursor.getColumnIndex(ChecksDBAdapter.WORKED)); 
       overtimeHours = checkCursor.getDouble(checkCursor.getColumnIndex(ChecksDBAdapter.OVERTIMEWORKED)); 
       payrate = checkCursor.getDouble(checkCursor.getColumnIndex(ChecksDBAdapter.PAYRATE)); 
       overtimePayrate = checkCursor.getDouble(checkCursor.getColumnIndex(ChecksDBAdapter.OVERTIMEPAYRATE)); 
       beforeTax = checkCursor.getDouble(checkCursor.getColumnIndex(ChecksDBAdapter.BEFORETAXES)); 
       afterTax = checkCursor.getDouble(checkCursor.getColumnIndex(ChecksDBAdapter.AFTERTAXES)); 

       check = new ChecksGetterSetter(
         "", "", 
         String.valueOf(decimalToTime(hours)), 
         String.valueOf(decimalToTime(overtimeHours)), 
         moneyFormat(payrate), 
         moneyFormat(overtimePayrate), 
         moneyFormat(beforeTax), 
         moneyFormat(afterTax) 
       ); 
       adapter.addItem(check); 
      } 
     } 
    } 

    private void getAdditionalCheckInfo() { 
     if (checkCursor.getCount() != 0) { 
      while (checkCursor.moveToNext()) { 
       socialSecurity = checkCursor.getDouble(checkCursor.getColumnIndex(ChecksDBAdapter.SOCIALSECURITY)); 
       medicare = checkCursor.getDouble(checkCursor.getColumnIndex(ChecksDBAdapter.MEDICARE)); 
       federalIncomeTax = checkCursor.getDouble(checkCursor.getColumnIndex(ChecksDBAdapter.FEDERALTAXES)); 
       deductions = checkCursor.getDouble(checkCursor.getColumnIndex(ChecksDBAdapter.DEDUCTIONS)); 
       allowances = checkCursor.getInt(checkCursor.getColumnIndex(ChecksDBAdapter.ALLOWANCES)); 

       checkInfo = new ChecksGetterSetter(
         moneyFormat(socialSecurity), 
         moneyFormat(medicare), 
         moneyFormat(federalIncomeTax), 
         moneyFormat(allowances), 
         moneyFormat(deductions) 
       ); 
       adapter.addItem(checkInfo); 
      } 
     } 
    } 

после он проходит через getCheckInfo(), он заселят за ViewHolder просто отлично, но после getAdditionalCheckInfo() циклов он заменяет CardViews для первого со вторым и просто показывает пустые карты над ними. Что я делаю не так?

ответ

0

Вы можете использовать уникальный держатель вид, вы только нужно поместить список объектов и заполнить в onBindView, смотрите пример:

public class CustomAdapter extends RecyclerView.Adapter<MainSearchAdapter.ViewHolder> { 

    private List<Object> data; 

    public CustomAdapter(Lis<Object> data) { 
     this.data = data; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_layout, parent, false); 

     return new ViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     Object object = data.get(position); 

     holder.textView.setText("bla"); 
    } 

    @Override 
    public int getItemCount() { 
     return data.size(); 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 
     public TextView textView; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      textView = (TextView) itemView.findViewById(R.id.text_view); 
     } 
    }