【问题标题】:How do I prevent my list of EditText from editing multiple boxes when a single box is edited?编辑单个框时,如何防止我的 EditText 列表编辑多个框?
【发布时间】:2012-06-27 21:04:53
【问题描述】:

我正在尝试使用 EditText 控件实现 listView。问题是当我编辑其中一个字段时,视图中也修改了其他一些字段。但是,我的 Java 对象只反映了我所做的更改(而不是设置的其他 EditText)

我的安卓活动

public class LoanRepaymentActivity extends ListActivity implements View.OnClickListener {

private Location lastKnownLocation;
private ArrayList<CurrentRepaymentInstallment> loansForRepayment;
@Override
public void onCreate(Bundle savedInstanceState){
    lastKnownLocation = Utility.getLastKnownLocation(this);
    super.onCreate(savedInstanceState);

    Intent intent = getIntent();

    RepaymentInfo repaymentInfo = (RepaymentInfo)intent.getSerializableExtra(Constants.CURRENT_REPAYMENT_INSTALLMENT);
    loansForRepayment = repaymentInfo.getLoansForRepayment();
    boolean repaymentsNotPresent = loansForRepayment == null || loansForRepayment.isEmpty(); 
    if(repaymentsNotPresent){
        Dialog dialog = Utility.getDialogWithText(LoanRepaymentActivity.this, getText(R.string.noLoansForRepayment).toString());
        Utility.getDialogButton(dialog, LoanRepaymentActivity.this, PartnerGroupListActivity.class, intent.getStringExtra(Constants.ACECSS_TOKEN_PARAM));
        dialog.show();
    }

    ArrayAdapter<CurrentRepaymentInstallment> adapter = new LoanRepaymentListAdapter(this, loansForRepayment);

    View footer = getLayoutInflater().inflate(R.layout.loan_disbursement_footer, null);
    getListView().addFooterView(footer);

    setListAdapter(adapter);
/*       if(!repaymentsNotPresent)  {
        TextView textView = (TextView)findViewById(R.id.screenTitle);
        String currentInstallmentLabel = getText(R.string.currentInstallmentLabel).toString() + repaymentInfo.getCurrentGroupInstallment();
        textView.setText(currentInstallmentLabel);
    }*/

    Button button = (Button)findViewById(R.id.disburse);
    button.setOnClickListener(this);
}

我的 XML 布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>

<TextView android:id="@+id/screenTitle" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" >
</TextView>

 <ListView
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_above="@+layout/loan_disbursement_footer"
     />
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
    android:id="@+id/borrowerName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@+id/label"
    android:textSize="14sp"
     >
</TextView>

<TextView
    android:id="@+id/loanAmount"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@+id/label"
    android:textSize="14sp"
     >
</TextView>

<TextView
    android:id="@+id/installmentNumber"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@+id/label"
    android:textSize="12sp"
    >
</TextView>

<TextView
    android:id="@+id/estimatedTotal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@+id/label"
    android:textSize="12sp"
    >
</TextView>

</LinearLayout>
<EditText
    android:id="@+id/repaymentAmount"
    android:layout_width="100sp"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:inputType="numberDecimal"
    android:textSize="12sp"
     >
</EditText>
</RelativeLayout>

用于设置 ListView 的自定义数组适配器

public class LoanRepaymentListAdapter extends ArrayAdapter<CurrentRepaymentInstallment> {

private final List<CurrentRepaymentInstallment> loansForRepayment;
private final Activity context;

public LoanRepaymentListAdapter(Activity context, List<CurrentRepaymentInstallment> loansForRepayment) {
    super(context, R.layout.loan_repayments, loansForRepayment);
    this.context = context;
    this.loansForRepayment = loansForRepayment;
}

static class ViewHolder {
    protected TextView borrowerName;
    protected TextView loanAmount;
    protected TextView installmentNumber;
    protected TextView estimatedTotal;
    protected EditText repaymentAmount;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View view = null;
    if (convertView == null) {
        LayoutInflater inflator = context.getLayoutInflater();
        view = inflator.inflate(R.layout.loan_repayments, null);
        final ViewHolder viewHolder = new ViewHolder();
        viewHolder.borrowerName = (TextView) view.findViewById(R.id.borrowerName);
        viewHolder.loanAmount = (TextView) view.findViewById(R.id.loanAmount);
        viewHolder.installmentNumber = (TextView) view.findViewById(R.id.installmentNumber);
        viewHolder.estimatedTotal = (TextView) view.findViewById(R.id.estimatedTotal);
        viewHolder.repaymentAmount = (EditText) view.findViewById(R.id.repaymentAmount);
//          viewHolder.repaymentAmount.setEditableFactory(Editable.Factory.getInstance());
        viewHolder.repaymentAmount.addTextChangedListener(new TextWatcher() {
            @Override
            public void afterTextChanged(Editable arg0) {

            }
            @Override
            public void beforeTextChanged(CharSequence s, int start,
                    int count, int after) {
                // TODO Auto-generated method stub

            }
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                CurrentRepaymentInstallment loanRepayment = (CurrentRepaymentInstallment) viewHolder.repaymentAmount.getTag();
                String repaymentAmount =  s.toString();
                loanRepayment.setRepaymentAmount(repaymentAmount);
            }
        });
        view.setTag(viewHolder);
        viewHolder.repaymentAmount.setTag(loansForRepayment.get(position));
    } else {
        view = convertView;
        ((ViewHolder) view.getTag()).repaymentAmount.setTag(loansForRepayment.get(position));
    }
    ViewHolder holder = (ViewHolder) view.getTag();
    holder.borrowerName.setText(loansForRepayment.get(position).getLoanProfileBasicInfo().getBorrowerBasicInfo().getFirstName());
    holder.loanAmount.setText("Rs. " + Float.toString(loansForRepayment.get(position).getLoanProfileBasicInfo().getLoanAmountInPaisa()/100));
    holder.estimatedTotal.setText("Rs. " + Float.toString(loansForRepayment.get(position).getEstimatedTotalAmount()/100));
    holder.installmentNumber.setText("Inst no : " + Integer.toString(loansForRepayment.get(position).getInstallmentNumber()));
    float repaymentAmt = loansForRepayment.get(position).getRepaymentAmount();
    if(repaymentAmt != 0.0) holder.repaymentAmount.setText(Float.toString(repaymentAmt));
    return view;
    }
}

【问题讨论】:

  • addTextChangeListener-line 放在 if 语句之后。您还可以像new TextWatcher(position) 一样为 TextWatcher 提供位置并使用该位置。
  • @MartijnVanMierloo 我应该把它放在 else 块内还是放在 else 块外?
  • 在 if 和 else 块之外 :)
  • @MartijnVanMierloo - 我把代码留在了同一个地方。我得到了持有人的标签并设置了对象值。所以现在java对象设置正确。唯一剩下的就是显示的多个 EditTexts

标签: android android-listview android-arrayadapter android-edittext


【解决方案1】:

Android ListView 回收的原因.. 请查看以下链接中接受的答案 EditText in ListView without it recycling input

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    解决方案是在设置文本之前删除添加的文本观察器。否则,该视图上的前一个 textwatcher 仍将与新的 textwatcher 一起被调用。将 textwatcher 作为标签存储在 EditText 上以跟踪它。

    Object oldWatcher = viewHolder.quantitySold.getTag();
    if(oldWatcher != null){
        viewHolder.quantitySold.removeTextChangedListener((CustomTextWatcher)oldWatcher);
    } 
    String oldText =  inputValues.get("key"+position);
    Log.d(TAG, "oldText: "+oldText+" position: "+position);
    viewHolder.quantitySold.setText(oldText == null ? "" : oldText);
    CustomTextWatcher watcher = new CustomTextWatcher(
            cursor.getString(SKUFragment.COL_NAME),
            cursor.getInt(SKUFragment.COL_ID),
            cursor.getDouble(SKUFragment.COL_UNIT_PRICE),
            position
    ) {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
        }
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
    
        }
    
        @Override
        public void afterTextChanged(Editable s) {
            if (s != null) {
                int quantity = 0;
                if (!TextUtils.isEmpty(s.toString())) {
                    quantity = Integer.parseInt(s.toString());
                    inputValues.put("key"+mPosition, "" + quantity);
                }else{
                    inputValues.put("key"+mPosition, "");
                }
                double value = quantity * skuPrice;
                mListener.onQuantityChanged(skuName+", position: "+mPosition, skuId, quantity, value);
            }
        }
    };
    viewHolder.quantitySold.setTag(watcher);
    viewHolder.quantitySold.addTextChangedListener(watcher);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多