0

Mein erstes Problem ist, dass ich in meiner Aktivität einen Betrag in meinem Adapter übergebe, um ihn zu verwenden, um den Text bearbeiten Wert in meinem Adapter zu setzen, aber es wird nicht angezeigt. Mein zweites Problem ist, dass wenn ich den Wert von meinem Text in meinem Adapter ändern, der Wert verliert, wenn ich die Listenansicht blättern.EditText zeigt beim Adapteraufruf keinen Wert an, und EditText verliert Wert, wenn listView im Bildlauf ist.

Hier mein Code in Adapter:

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) –

Antwort

0

Zunächst empfehle ich RecyclerView statt Listview verwenden, eine einfache Implementierung wird das Problem der Bildlauf vermeiden. Ich empfehle diese Links:
https://developer.android.com/training/material/lists-cards.html https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html

Zweitens die Methode invoicePopulate * die SQLite-Datenbank jedes Mal eine Ansicht erstellt öffnet, ergibt dies ein ernsthaftes Performance-Problem, weil mit dem Rolle- der Ansichten neu erstellt werden und Sie erzeugen mehr Instanzen am Ende werden Sie mit einem Fehler enden und Sie werden nicht in der Lage sein, auf die Datenbank zuzugreifen. Dazu empfehle ich, dass Sie die Daten zuvor berechnen und an den Adapter übergeben.

Es ist am besten, die Adapter zu verwenden, um nur Informationen anzuzeigen, wenn Sie versuchen müssen, es vorher zu berechnen.