所以,我有一个带有TextView的活动和一个带有自定义BaseAdapter的ListView。此活动如下所示:
正如您所看到的,列表中的每个项目都是自定义布局,基本思想是:每当其中的数字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;
}
}
我被困在这一点上,任何帮助都将受到赞赏。
答案 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));
}));
显然你可能需要调整其中的一些以使其完美匹配,而我还没有测试过,所以有些事情可能会有所不同,但这应该让你朝着正确的方向前进。如果您有任何问题随时发表评论,我会尽力帮助您完成。
备注强>