0

私の第一の問題は、私のアクティビティで、私のアダプターにAmountを渡してそれを使用して、アダプター内のテキストの編集値を設定しても表示されないということです。 私の2番目の問題は、自分のアダプター内の自分の編集テキストの値を変更すると、リストビューをスクロールすると値が失われることです。ListViewがスクロールされると、EditTextは値を表示せずにアダプタ呼び出しとEditTextの値を失います。

ここアダプタでの私のコード:

public class CustomListView_InvoiceList extends BaseAdapter { 

private Context mContext; 
private List<InvoiceList> invoiceLists; 
private float TotalPaymentAmount; 

public CustomListView_InvoiceList(Context mContext, List<InvoiceList> invoiceLists, Float totalPaymentAmount) { 
    this.mContext = mContext; 
    this.invoiceLists = invoiceLists; 
    this.TotalPaymentAmount = totalPaymentAmount; 
} 

public static class ViewHolder { 
    CheckBox SelectInvoiceCB, PayFull, PayPartial; 
    TextView SalesInvoiceNo, InvoiceDate, InvoiceAmount, AmountDue, DueDate, CreditMemoID, CreditMemoDate, CreditMemoReason; 
    LinearLayout LL2, LL3; 
    EditText TotalAmount; 
    ImageView CaptureForm; 
} 

@Override 
public View getView(final int position, View view, ViewGroup viewGroup) { 
    //View v = View.inflate(mContext, R.layout.sales_invoice_custom,null); 
    final ViewHolder holder; 

    if (view == null) { 
     view = View.inflate(mContext, R.layout.sales_invoice_custom, null); 
     holder = new ViewHolder(); 

     holder.SelectInvoiceCB = (CheckBox) view.findViewById(R.id.selectInvoiceCB); 
     holder.SalesInvoiceNo = (TextView) view.findViewById(R.id.SINo); 
     holder.InvoiceDate = (TextView) view.findViewById(R.id.SIDate); 
     holder.InvoiceAmount = (TextView) view.findViewById(R.id.SIAmount); 
     holder.AmountDue = (TextView) view.findViewById(R.id.SIAmountDue); 
     holder.DueDate = (TextView) view.findViewById(R.id.SIdueDate); 
     holder.PayFull = (CheckBox) view.findViewById(R.id.SIFull); 
     holder.PayPartial = (CheckBox) view.findViewById(R.id.SIPartial); 
     holder.TotalAmount = (EditText) view.findViewById(R.id.SITotalAmount); 
     holder.CreditMemoID = (TextView) view.findViewById(R.id.creditMemoID); 
     holder.CreditMemoDate = (TextView) view.findViewById(R.id.creditMemoDate); 
     holder.CreditMemoReason = (TextView) view.findViewById(R.id.creditMemoReason); 
     holder.LL2 = (LinearLayout) view.findViewById(R.id.ll2); 
     holder.LL3 = (LinearLayout) view.findViewById(R.id.ll3); 

     holder.SelectInvoiceCB.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag. 
       invoiceLists.get(getPosition).setSelectInvoice(buttonView.isChecked()); // Set the value of checkbox to maintain its state. 
      } 
     }); 

     holder.PayFull.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag. 
       invoiceLists.get(getPosition).setPayFull(buttonView.isChecked()); // Set the value of checkbox to maintain its state. 
       if (holder.PayFull.isChecked()) { 
        holder.PayPartial.setChecked(false); 
       } 
      } 
     }); 

     holder.PayPartial.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag. 
       invoiceLists.get(getPosition).setPayPartial(buttonView.isChecked()); // Set the value of checkbox to maintain its state. 
       if (holder.PayPartial.isChecked()) { 
        holder.PayFull.setChecked(false); 
       } 
      } 
     }); 

     view.setTag(holder); 
     view.setTag(R.id.SITotalAmount, holder.TotalAmount); 
     view.setTag(R.id.selectInvoiceCB, holder.SelectInvoiceCB); 
     view.setTag(R.id.SIFull, holder.PayFull); 
     view.setTag(R.id.SIPartial, holder.PayPartial); 
    } else { 
     holder = (ViewHolder) view.getTag(); 
    } 

    InvoicePopulate(view,holder, position); 

    return view; 
} 

public void InvoicePopulate(final View view, final ViewHolder holder, final int position) { 
    dbHelper = new DBHelper(mContext); 

    Calendar c = Calendar.getInstance(); 
    SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd"); 
    final String formattedDate = df1.format(c.getTime()); 

    try { 
     dbHelper.openDataBase(); 

     // LAYOUT VISIBILITY FOR CREDIT MEMOs 
     try { 
      if (invoiceLists.get(position).getCredit_Memo_ID().equals(null) || invoiceLists.get(position).getCredit_Memo_ID().isEmpty() 
        || invoiceLists.get(position).getCredit_Memo_ID().length() < 1 
        || invoiceLists.get(position).getCredit_Memo_ID().trim().equals("")){ 
       holder.CreditMemoID.setVisibility(View.GONE); 
       holder.CreditMemoDate.setVisibility(View.GONE); 
       holder.CreditMemoReason.setVisibility(View.GONE); 
       holder.LL2.setVisibility(View.GONE); 
       holder.LL3.setVisibility(View.GONE); 
      } else { 
       holder.LL2.setVisibility(View.VISIBLE); 
       holder.LL3.setVisibility(View.VISIBLE); 
       holder.CreditMemoID.setVisibility(View.VISIBLE); 
       holder.CreditMemoDate.setVisibility(View.VISIBLE); 
       holder.CreditMemoReason.setVisibility(View.VISIBLE); 

       holder.CreditMemoID.setText(invoiceLists.get(position).getCredit_Memo_ID()); 
       holder.CreditMemoDate.setText(invoiceLists.get(position).getCredit_Memo_Date().substring(0,10)); 
       holder.CreditMemoReason.setText(invoiceLists.get(position).getCredit_Memo_Reason()); 
      } 
     } catch (Exception e) { 
      e.getMessage(); 
     } 

     holder.SalesInvoiceNo.setText(invoiceLists.get(position).getSales_Invoice_ID()); 
     holder.InvoiceDate.setText(invoiceLists.get(position).getInvoice_Date()); 
     holder.DueDate.setText(invoiceLists.get(position).getDue_Date()); 

     float invAmount = 0; 
     invAmount = Math.round(Float.parseFloat(invoiceLists.get(position).getInvoice_Amount())*100.00)/(float)100.00; 
     holder.InvoiceAmount.setText(String.format("%,.2f",invAmount)); 
     holder.AmountDue.setText(String.format("%,.2f",invAmount)); 
     //holder.InvoiceAmount.setText(invoiceLists.get(position).getInvoice_Amount()); 

     holder.TotalAmount.setTag(position); 
     holder.SelectInvoiceCB.setTag(position); // This line is important. 
     holder.PayFull.setTag(position); // This line is important. 
     holder.PayPartial.setTag(position); // This line is important. 


     holder.TotalAmount.setText(invoiceLists.get(position).getAmount_Paid()); 
     holder.SelectInvoiceCB.setChecked(invoiceLists.get(position).isSelectInvoice()); 
     holder.PayFull.setChecked(invoiceLists.get(position).isPayFull()); 
     holder.PayPartial.setChecked(invoiceLists.get(position).isPayPartial()); 

     try { 
      if (invoiceLists.get(position).getAmount_Paid().toString().equals("") || 
        invoiceLists.get(position).getAmount_Paid().toString().equals("0.0") || 
        Float.parseFloat(invoiceLists.get(position).getAmount_Paid().toString()) < 1) { 
       invAmount = 0; 
       invAmountDue = 0; 
       invAmountPaid = 0; 
       //invAmount = Float.parseFloat(invoiceLists.get(position).getInvoice_Amount()); 
       invAmount = Math.round(Float.parseFloat(invoiceLists.get(position).getInvoice_Amount())*100.00)/(float)100.00; 
       invAmountDue = invAmount - invAmountPaid; 
       Log.e("Without AmountPaid ", "Amount Due : " + String.valueOf(invAmountDue)); 
      } else { 
       invAmount = 0; 
       invAmountDue = 0; 
       invAmountPaid = Math.round(Float.parseFloat(invoiceLists.get(position).getAmount_Paid())*100.00)/(float)100.00; 
       //invAmount = Float.parseFloat(invoiceLists.get(position).getInvoice_Amount()); 
       invAmount = Math.round(Float.parseFloat(invoiceLists.get(position).getInvoice_Amount())*100.00)/(float)100.00; 
       invAmountDue = invAmount - invAmountPaid; 
       Log.e("With AmountPaid ", "Amount Due : " + String.valueOf(invAmountDue)); 
      } 

      holder.AmountDue.setText(String.format("%,.2f",invAmountDue)); 
      //holder.InvoiceAmount.setText(invoiceLists.get(position).getInvoice_Amount()); 
     } catch (Exception e) { 
      e.getMessage(); 
     } 

     /*final float finalInvAmount = invAmountDue; 
     holder.PayFull.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (holder.PayFull.isChecked()) { 
        holder.PayPartial.setChecked(false); 
        if (holder.SelectInvoiceCB.isChecked()) { 
         invoiceStatusValue = "PAID_FULL"; 
         holder.TotalAmount.setText(String.valueOf(Math.round(finalInvAmount*100.00)/100.00)); 
         //holder.TotalAmount.setText(holder.InvoiceAmount.getText().toString()); 
        } 
       } 
      } 
     }); 

     holder.PayPartial.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (holder.PayPartial.isChecked()) { 
        holder.PayFull.setChecked(false); 
        if (holder.SelectInvoiceCB.isChecked()) { 
         invoiceStatusValue = "PAID_PARTIAL"; 
         holder.TotalAmount.setText("0.00"); 
        } 
       } 
      } 
     });*/ 

     if (TotalPaymentAmount >= Float.parseFloat(String.valueOf(invAmountDue))) { 
      holder.SelectInvoiceCB.setChecked(true); 
      holder.PayFull.setChecked(true); 
      holder.PayFull.setClickable(true); 
      holder.PayPartial.setClickable(true); 

      holder.TotalAmount.setText(String.valueOf(Math.round(invAmountDue * 100.00)/100.00)); 

      System.out.println("TotalPaymentAmount: " + TotalPaymentAmount); 
      System.out.println("invAmountDue: " + invAmountDue); 

      if (Float.parseFloat(String.valueOf(invAmountDue)) < 1) { 
       Log.e("Computations : ", TotalPaymentAmount + " + " + String.valueOf(Float.parseFloat(String.valueOf(invAmountDue)))); 
       Log.e("Equals ", "TotalPaymentAmount = " + TotalPaymentAmount); 
      } else { 
       TotalPaymentAmount = TotalPaymentAmount - Float.parseFloat(String.valueOf(invAmountDue)); 
      } 
     } else { 
      if (TotalPaymentAmount < 1) { 
       holder.TotalAmount.setText("0.00"); 
       /*holder.PayFull.setClickable(false); 
       holder.PayPartial.setClickable(false);*/ 

      } else { 
       holder.SelectInvoiceCB.setChecked(true); 
       holder.PayPartial.setChecked(true); 
       holder.PayFull.setClickable(true); 
       holder.PayPartial.setClickable(true); 
       holder.TotalAmount.setText(String.valueOf(Math.round(TotalPaymentAmount * 100.00)/100.00)); 

       if ((TotalPaymentAmount - Float.parseFloat(String.valueOf(invAmountDue))) < 0) { 
        TotalPaymentAmount = (float) 0.0; 
       } else { 
        TotalPaymentAmount = TotalPaymentAmount - Float.parseFloat(String.valueOf(invAmountDue)); 
       } 
      } 
     } 

    } catch (Exception e) { 
     e.getMessage(); 
     System.out.println("Custom Invoice List: " + e); 
    } finally { 
     dbHelper.close(); 
    } 

} 
+0

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#notifyItemChanged(int) –

答えて

0

まず、私はRecyclerViewの代わりに、リストビューを使用することをお勧めし、単純な実装は、スクロールの問題を回避します。 が、私はこれらのリンクをお勧めします:
https://developer.android.com/training/material/lists-cards.html https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html

第二に、*はSQLiteデータベースにビューが作成されるたびに開く方法invoicePopulateを、スクロールしてビューを再作成しているため、これは深刻なパフォーマンスの問題を与え、あなたは複数の生成しますインスタンスが終了すると、エラーが発生し、データベースにアクセスできなくなります。このためには、以前にデータを計算し、それをアダプタに渡すことをお勧めします。

前もって試してみる必要がある場合は、アダプターを使用して情報を表示することをお勧めします。

関連する問題