我有一個基於帶有幾個TextViews和一個EditText的RelatieLayout的ListView。其中一個文本字段會根據EditText字段中的值進行更新。帶有幾個edittext字段的ListView
我的問題是在滾動listView時保留editText字段的值。我BaseAdapter的extention看起來是這樣的:
public class ListViewAdapter extends BaseAdapter {
static class ItemViewHolder {
TextView
itemName,
itemPrize,
itemTotalPrize,
EditText
itemAmount;
}
static class CatViewHolder {
TextView
categoryName;
Button
categoryInfo;
}
ArrayList<ListItem> itemsList;
HashMap<Integer, String> volume = new HashMap<Integer, String>();
public ListViewAdapter(ArrayList<ListItem> itemsList) {
this.itemsList = itemsList;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return this.itemList.size();
}
@Override
public ListItem getItem(int position) {
// TODO Auto-generated method stub
return this.itemList.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
if (getItem(position).isCategory()) return 0;
else return 1;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if (!getItem(position).isCategory()) {
String[] string;// = {"", ""};
final Item item = (Item) getItem(position);
if (row == null) {
row = inflater.inflate(R.layout.item, parent, false);
viewHolder = new ItemViewHolder();
viewHolder.itemName = (TextView) row.findViewById(R.id.itemName);
viewHolder.itemPrize = (TextView) row.findViewById(R.id.itemPrize);
viewHolder.itemTotalPrize = (TextView) row.findViewById(R.id.itemTotalPrize);
viewHolder.itemAmount = (EditText) row.findViewById(R.id.itemAmount);
row.setTag(viewHolder);
} else viewHolder = (DrugViewHolder) row.getTag();
viewHolder.itemName.setText(item.getName());
viewHolder.itemPrize.setText(String.valeuOf(item.getPrize()));
viewHolder.itemAmount.addTextChangedListener(new AmountTextWatcher(item, position, row));
viewHolder.itemAmount.setText(volume.get(item.getId)));
viewHodler.itemTotalPrize.setText(String.valueOf(item.getPrize() * volume.get(item.getId));
} else {
Category category = (Category) getItem(position);
if (row == null) {
row = inflater.inflate(R.layout.category, parent, false);
catViewHolder = new CatViewHolder();
catViewHolder.categoryName = (TextView) row.findViewById(R.id.categoryName);
catViewHolder.categoryInfo = (Button) row.findViewById(R.id.categoryInfo);
row.setTag(catViewHolder);
} else catViewHolder = (CatViewHolder) row.getTag();
catViewHolder.categoryName.setText(category.getCatName());
}
return row;
}
@Override
public void AmountTextWatcher_interface(String amount, int position) {
volume.put(position, amount);
}
編輯,添加列表項結構
列表項類,看起來像這樣:
package com.buy.ng;
public interface ListItem {
public boolean isCategory();
}
我的兩個對象,項目和cateogory實現列表項並且isCategory()在item和cateogry中都被覆蓋。 Item返回false,並且該類別返回true。
我AmountTextWatcher看起來是這樣的:
class AmountTextWatcher implements TextWatcher {
public AmountTextWatcher_Interface textChangedListener = null;
interface AmountTextWatcher_Interface {
public abstract void AmountTextWatcher_interface(String amount, int position);
}
private static final String TAG = "amountTextWatcher";
private TextView textView_TotalPrize,
private Item item;
public PrizeTextWatcher(Item item, int position, View row) {
this.row = row;
this.item = item;
this.textView_TotalPrize = (TextView) row.findViewById(R.id.itemTotalPrize);
}
@Override
public void afterTextChanged(Editable s) {
String amount = s.toString().replace(",", ".").trim();
int dummy;
if (amount.length() == 0 || amount == null) amount = "0";
try {
dummy = Integer.valueOf(amount);
} catch (NumberFormatException npe) {
amount= "0";
EditText editText = (EditText) view.findViewById(R.id.itemAmount);
editText.setText("");
}
this.textView_prize.setText(Intege.valueOf(amount) * item.getPrize());
textChangedListener.PrizeTextWatcher_interface(amount, item.getId());
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
}
我試過幾種方法,但我不能得到量的EditText字段的值要在ListView的滾動保存。我試過HashMap的金額=新的HashMap();並使用在EditText,volume.put(item.getId(),amount)中輸入的值填充這個值,但我似乎無法做到。
嘗試了一個接口,這個PrizeTextWatcher的amount和item.getId()作爲變量。這個接口是在ListViewAdapter實現,它modifes這樣該適配器內的HashMap量:
@Override
public void AmountTextWatcher_interface(String amount, int id) {
volume.put(id, amount);
}
任何建議或我在做這一切錯了嗎?作爲Android的相對新手,我覺得這很困難才達到...
關於它的EditText你說的? 'viewHolder.itemAmount =(EditText)row.findViewById(R.id.itemAmount);'或'EditText editText =(EditText)view.findViewById(R.id.amount);'?您至少應該使用保存的輸入值填寫getView()中提到的EditText。用戶在該editdtext中輸入值?你對此不清楚。開始注意輸入的文本被保存並在用戶滾動列表時放回。你可以使用一個字符串ArrayList。 – greenapps 2014-11-08 18:38:41
對不起。錯別字。 RelativeLayout中只有一個EditText,它被稱爲itemAmount。用戶在EditText字段中輸入值或從SparseArray中的值中設置值。我的問題是,它在上面的代碼中被稱爲音量,我似乎無法保存並找回正確的值。在getView()中,我使用viewHolder.itemAmount.setText(volume.get(item.getId)))設置itemAmount EditText;;並且我嘗試通過volume.put(item.getId())設置它在textwatcher界面中。量)。但它不起作用。我可能會在這上面讓我失明。也許一個啤酒和一個晚上睡覺會幫助... – user1086500 2014-11-08 19:42:04