2013-01-06 63 views
0

我有一個列表視圖,它有一個自定義適配器,其中每行左側有一個textview,右側有一個edittext,用戶可以使用它來修改條目值。動態地更改listview適配器中的數據

默認情況下,放置在每個視圖的EditText視圖中的值是從傳遞到適配器的字符串數組獲得的。

我想知道我可以如何讓用戶編輯這些值並將結果保存回相同的字符串數組。

我已經嘗試添加文本更改偵聽器,因此當用戶編輯值時,新字符串被放置在原始字符串數組中的適當位置。問題在於,當用戶滾動文本時,更改偵聽器被激活,並且數組中的值被空字符串覆蓋。

下面是一些代碼:

public EditTagsListViewAdapter(Context context, String[] objectKeys, String[] objectValues) { 
     super(); 
     this.context = context; 
     this.objectKeys = objectKeys; 
     this.objectValues = objectValues; 
    } 

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

    @Override 
    public String[] getItem(int position) { 
     String[] item = new String[2]; 
     item[0] = objectKeys[position]; 
     item[1] = objectValues[position]; 
     return item; 
    } 

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

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 

     LayoutInflater mInflater = (LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.edit_osm_tag_row, null); 
      holder = new ViewHolder(); 
      holder.key = (TextView) convertView.findViewById(R.id.tagKey); 
      holder.value = (EditText) convertView.findViewById(R.id.tagValue); 

      convertView.setTag(holder); 
     } 
     else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     String[] rowItem = (String[]) getItem(position); 

     holder.key.setText(rowItem[0]); 
     if(rowItem[1].equals("null")) { 
      holder.value.setText(""); 
     } else { 
      holder.value.setText(rowItem[1]); 
     } 

     holder.value.addTextChangedListener(new TextWatcher() { 

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

      } 

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

      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       objectValues[position] = s.toString(); 
       Log.i(TAG, "Added changes to adapter"); 

      } 
     }); 


     return convertView; 
    } 


    static class ViewHolder { 
     protected TextView key; 
     protected EditText value; 
    } 

我設置一些的EditText值空白if(rowItem[1].equals("null")) {後,由於一些變量objectValues值將被設置爲字符串「null」,但我希望它們出現空白。

希望這是有道理的。有誰知道我能做到這一點?

感謝

回答

0

而非TextWatcher,您可以使用OnEditorActionListener保存更改當用戶按下鍵盤上的「Enter」鍵。

editText.setOnEditorActionListener(new OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
     if(actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) { 
      objectValues[position] = v.getText().toString(); 
      return true; 
     } 

     return false; 
    } 
}); 
2

一般而言,您的數據源不應該與您的視圖/適配器緊密耦合。這意味着您可以更改該數據源中的數據,而不管它是否被視圖使用。當用戶想要更改數據時,只需更新源(數組),然後指示適配器/視圖重繪。

某些適配器可能會在更改其內容時遇到問題,但是如果從頭開始實施自己的適配器,或者使用鬆散耦合的Adapter類,則不應該遇到任何問題。

如果您使用擴展BaseAdapter的適配器,則可以簡單地調用notifyDataSetChanged(),適配器應該找出其餘的。