从ListView项目中的EditText值更新活动的TextView

时间:2016-11-17 19:40:49

标签: android listview textview listadapter

所以,我有一个带有TextView的活动和一个带有自定义BaseAdapter的ListView。此活动如下所示:

enter image description here

正如您所看到的,列表中的每个项目都是自定义布局,基本思想是:每当其中的数字EditText发生更改时,活动中的“总”TextView(每个项目的价格总和)产品)也必须更新。

我想它必须以某种方式从Adapter类完成,但我不知道该怎么做。

我的Activity文件看起来像这样(它通过“GetCollectionProducts”AsyncTask从服务器获取产品数据,我设置了适配器):

public class ProductAisleActivity extends AppCompatActivity implements View.OnClickListener{
ListView productList;
Button participate;

ImageButton search;
EditText searchET;
TextView productsTotal;

Product[] colProducts;
RelativeLayout collectionHeader;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_product_aisle);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    /* ...
       Irrelevant code to this question 
    */

    productsTotal = (TextView) findViewById(R.id.products_aisle_total);
    productsTotal.setText(
            getResources().getString(
                    R.string.productsTotal,
                    String.valueOf(0.00)
            )
    );

    productList = (ListView) findViewById(R.id.products_aisle_list);
    new GetCollectionProducts().execute();
}

private class GetCollectionProducts extends AsyncTask<Void,Void,JSONArray>{

    @Override
    protected JSONArray doInBackground(Void... voids) {
        /* Irrelevant code to this question */
    }

    @Override
    protected void onPostExecute(JSONArray jsonArray) {
        /* Irrelevant code to this question */
                productList.setAdapter(
                        new CollectionProductsAdapter(
                                ProductAisleActivity.this,
                                colProducts
                        )
                );
}
}

我的Adapter文件如下所示:

public class CollectionProductsAdapter extends BaseAdapter {
Context context;
ProductAisleActivity.Product[] data;
private static LayoutInflater inflater = null;

public CollectionProductsAdapter(Context context, ProductAisleActivity.Product[] data) {
    this.context = context;
    this.data = data;
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
    return data.length;
}

@Override
public Object getItem(int i) {
    return data[i];
}

@Override
public long getItemId(int i) {
    return i;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    View v = view;
    if (v == null) {
        v = inflater.inflate(R.layout.product_row_layout, null);
    }

    ProductAisleActivity.Product product = data[i];

    /* ...
       Irrelevant code to this question 
    */

    EditText productQuantity = (EditText) v.findViewById(R.id.productQuantity);
    productQuantity.setText("0");


    return v;
}

}

我被困在这一点上,任何帮助都将受到赞赏。

2 个答案:

答案 0 :(得分:0)

您希望添加textChangedListener,以便在EditText中更改项目值作为用户更改值。

您可以在此处使用TextChangedListener:

EditText myEditTextField = new EditText(this);

myEditTextField.addTextChangedListener(new TextWatcher() {
    @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) {

    }
});

您可以根据需要执行任务。它有3种方法:

1.beforeTextChanged

2.onTextChanged

3.afterTextChanged

因此,您可以在&#34; afterTextChanged&#34;的帮助下完成任务。你必须简单地调用你的计算价格的方法。用户输入特定号码时的项目。它会根据您的需要显示价格。

希望这有帮助!

答案 1 :(得分:0)

首先,您需要侦听EditText中的任何更改,以便您可以动态处理事物,而无需显式使用提交按钮等内容。您可以使用TextWatcher执行此操作。

productQuanity.addTextChangedListener(new TextWatcher() {
        private double originalCost = 0.0;

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            // Before we change the text, set the originalCost
            // so we can know what the change is after the edit
            originalCost = getCost(s.toString());
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // You don't need to utilize this method
        }

        @Override
        public void afterTextChanged(Editable s) {
             // After the change has taken place in the text,
             // get the new cost and calculate the difference
             double newCost = getCost(s.toString());
             double changeInCost = newCost - originalCost;
        }

        private double getCost(String input){
            String count = input.toString();
            if(TextUtils.isEmpty(count))
                return 0.0;
            else
                return (double) Integer.parseInt(count) * product.getPrice();
        }
    });

既然我们已经改变了成本,我们该怎么做呢?我们需要通知活动我们有变更。我们可以用观察者做到这一点,这很好,但为了好玩,让我们使用一个接口来实现一个监听器。

修改适配器类

public class CollectionProductsAdapter extends BaseAdapter {

    public interface CostChangedListener{
        void onCostChanged(double change);
    }

    Context context;
    ProductAisleActivity.Product[] data;
    private LayoutInflater inflater = null; // THIS SHOULDN'T BE STATIC
    CostChangedListener listener;

    public CollectionProductsAdapter(Context context, ProductAisleActivity.Product[] data, CostChangedListener listener) {
        this.context = context;
        this.data = data;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.listener = listener;
    }

    // The rest of your code
}

现在,当我们更新TextWatcher中的费用时,我们可以调用

if(listener != null)
    listener.onCostChanged(changeInCost);

最后,为了确保我们正确使用它,我们需要在CollectionProductsAdapter构造函数中传递一个监听器

productList.setAdapter(new CollectionProductsAdapter(
            ProductAisleActivity.this, colProducts,
            new CostChangeListener(){
                @Override
                public void onCostChanged(double change){
                    double currentTotal = Double.valueOf(productTotal.getText());
                    double newTotal = currentTotal + change;
                    productTotal.setText(String.valueOf(newTotal));
                }));

显然你可能需要调整其中的一些以使其完美匹配,而我还没有测试过,所以有些事情可能会有所不同,但这应该让你朝着正确的方向前进。如果您有任何问题随时发表评论,我会尽力帮助您完成。

备注

  1. 不要像使用布局inflater那样保留静态引用
  2. 值得一看的是RecyclerView或至少带适配器的ViewHolder模式