2014-11-08 31 views
0

我有一個基於帶有幾個TextViews和一個EditText的RelatieLayout的ListView。其中一個文本字段會根據EditText字段中的值進行更新。帶有幾個edittext字段的Lis​​tView

我的問題是在滾動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的相對新手,我覺得這很困難才達到...

+0

關於它的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

+0

對不起。錯別字。 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

回答

0

更新此代碼

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 
+0

試過了,沒有工作。感謝您的建議! – user1086500 2014-11-08 15:00:41

+0

你的代碼很複雜,也可以在簡單代碼中實現 – inni 2014-11-08 15:07:04

+0

可以用ListItem結構與我分享 – inni 2014-11-08 15:10:45

0

選擇回答我的問題,用這種的ListView的有些工作版本。有一些用戶體驗問題,但是這個BaseAdapter處理edittext字段。

我的問題中的代碼和我的答案中的代碼之間的主要區別是什麼?

三ViewHolders

我想我可能只是從一個沒有需要的EDITTEXT場的意見取出的EditText場。錯誤。或者至少可以使用三個ViewHolders。

OnFocusChange

使用OnFocusChange而不是addTextChangedListener的。直接從這裏修改adpater-dataset,瞧!

requestFocusFromTouch

viewHolder.itemAmount.requestFocusFromTouch();觸摸時提供editText焦點。

在清單中,添加

android:windowSoftInputMode="adjustPan" 

到您的活動。

在該XML的列表視圖中添加

android:descendantFocusability="afterDescendants" 

一些人認爲, 「beforeDescendants」 應在XML的ListView控件中。不會改變我的示例代碼中的任何內容。

的adpater看起來是這樣的:

public class ListViewAdapter extends BaseAdapter { 

static class ItemViewHolderEditText { 
    TextView 
     itemName, 
     itemPrize, 
     itemTotalPrize, 
    EditText 
     itemAmount; 
} 

static class ItemViewHolder { 
    TextView 
     itemName, 
     itemPrize, 
     itemTotalPrize, 
} 

static class CatViewHolder { 
    TextView 
     categoryName; 
} 

ArrayList<ListItem> itemsList; 
Item item; 

public ListViewAdapter(ArrayList<ListItem> itemsList) { 
    this.itemsList = itemsList; 
} 

@Override 
public int getCount() { 
    return this.itemsList.size(); 
} 

@Override 
public ListItem getItem(int position) { 
    return this.itemsList.get(position); 
} 

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

@Override 
public int getViewTypeCount() { 
    return 3; 
} 

@Override 
public int getItemViewType(int position) { 
    if (getItem(position).isCategory()) return 0; 
     else { 
      item = (Item) getItem(position); 
      if (item.hasEditText()) return 1; 
      return 2; 
     } 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView;  
    if (!getItem(position).isCategory()) { 
     item = (Item) getItem(position); 
     if (item.hasEditText()) { 
      if (row == null) { 
       row = inflater.inflate(R.layout.item_edittext, parent, false); 
       viewHolder = new ItemViewHolderEditText(); 
       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 = (ItemViewHolderEditText) row.getTag(); 
      viewHolder.itemName.setText(item.getName()); 
      viewHolder.itemPrize.setText(String.valeuOf(item.getPrize())); 
      viewHolder.itemAmount.setId(position); 
      viewHolder.itemAmount.requestFocusFromTouch(); 
      viewHolder.itemAmount.selectAll(); 
      viewHolder.itemAmount.setOnFocusChangeListener(new OnFocusChangeListener() { 
       public void onFocusChange(View v, boolean hasFocus) { 
        if (!hasFocus){ 
         final EditText amount = (EditText) v; 
         Item item = (Item) itemsList.get(position); 
         item.setTotalPrize(Double.valueOf(amount.getText().toString().trim())); 
         itemsList.set(v.getId(), item); 
        } 
       } 
      });  
      viewHolder.itemAmount.setText(volume.get(item.getId))); 
      viewHodler.itemTotalPrize.setText(String.valueOf(item.getPrize() * volume.get(item.getId)); 
     } else { 
       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);     
        row.setTag(viewHolder); 
       } else viewHolder = (ItemViewHolder) row.getTag(); 
       viewHolder.itemName.setText(item.getName()); 
       viewHolder.itemPrize.setText(String.valeuOf(item.getPrize())); 
       viewHodler.itemTotalPrize.setText(item.getTotalPrize()); 
      } 
    } 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;  
}