2012-08-03 22 views
2

我正在嘗試創建一個ListActivity,它在自定義列表中連續有一個CheckBox,TextViewEditText保留和檢索CustomListView中的EditText中的值

我需要在我的EditText中獲取用戶的輸入,並在該行的CheckBox被選中時將該值保存在數據庫中。如果CheckBox未被選中,則EditText被禁用。後者我可以做,但我無法保留EditText的價值並將其存儲在數據庫中。

目前,如果我在EditText中輸入任何內容並按下後退按鈕以最小化鍵盤,則EditText將回到其先前的值。

我已將以下編碼至現在,以顯示自定義ListView並選擇和取消選中該複選框。我只需要幫助我EditText部分。

EditExepense.Java

package h.pkg.main; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 

import android.app.Activity; 
import android.app.ListActivity; 
import android.content.Context; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.CheckBox; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.RadioButton; 
import android.widget.RadioGroup; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.widget.RadioGroup.OnCheckedChangeListener; 

public class EditExpense extends ListActivity { 
    int eid, tid, mid; 
    String etyp,amount; 
    float eamt; 
    DBAdapter db; 
    ArrayList<Integer> memmid = new ArrayList<Integer>(); 
    ArrayList<String> memname = new ArrayList<String>(); 
    ArrayList<Float> memcexp = new ArrayList<Float>(); 
    List<Model> list = new ArrayList<Model>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Button Save = (Button)findViewById(R.id.Save); 
     //ListView l1= (ListView)findViewById(R.id.listView1); 
     setContentView(R.layout.eexp); 
     Bundle idata = getIntent().getExtras(); 
     db = new DBAdapter(this); 

     if (idata !=null) 
     { 
      eid=idata.getInt("EID"); 
      tid=idata.getInt("TID"); 
      etyp=idata.getString("ETYP"); 
      eamt=idata.getFloat("EXAMT"); 
      amount = "" + eamt; 
     } 

     try { 
      db.open(); 
      Cursor c = db.getAllmem(tid); 
      float nofm = (float)(c.getCount()); 
      float evenshareamt = eamt/nofm; 
      db.close(); 

      if (c != null) { 
       if (c.moveToFirst()) { 
        do { 
         String MN = c.getString(c.getColumnIndex("NAME")); 
         mid = c.getInt(c.getColumnIndex("MID")); 
         String ceamts = String.valueOf(evenshareamt); 

         list.add(get(MN,ceamts,true)); 

         memname.add(MN); 
         memmid.add(mid); 
         memcexp.add(evenshareamt); 
        } while (c.moveToNext()); 
       } 
      } 

      c.close(); 
     } finally { 
     } 

     ArrayAdapter<Model> adapter = new InteractiveArrayAdapter(this,list); 
     setListAdapter(adapter); 

     RadioGroup radioGroup = (RadioGroup) findViewById(R.id.radioGroup1); 
     RadioButton rbs = (RadioButton) findViewById(R.id.Shared); 
     RadioButton rbc = (RadioButton) findViewById(R.id.Custom); 

     radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
      public void onCheckedChanged(RadioGroup group, int checkedId) { 
       RadioButton rbs = (RadioButton) findViewById(R.id.Shared); 

       if (rbs.isChecked()) { 
        //DisplayToast("Option 1 checked!"); 
       } else { 
        //DisplayToast("Option 2 checked!"); 
       } 
      } 
     }); 
    }  

    public void expUpdate(View V) { 
     setResult(RESULT_OK); 
     finish(); 
    } 

    private Model get(String memn, String ceam, boolean sel) { 
     return new Model(memn,ceam,sel); 
    } 
} 

InteractiveArrayAdapter.Java

package h.pkg.main; 
import java.util.List; 

import android.app.Activity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnFocusChangeListener; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.EditText; 
import android.widget.TextView; 

public class InteractiveArrayAdapter extends ArrayAdapter<Model> { 
    private final List<Model> list; 
    private final Activity context; 

    public InteractiveArrayAdapter(Activity context, List<Model> list) { 
     super(context, R.layout.listview, list); 
     this.context = context; 
     this.list = list; 
    } 

    static class ViewHolder { 
     protected TextView memnames; 
     protected EditText ceamount; 
     protected CheckBox checkbox; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = null; 
     if (convertView == null) { 
      LayoutInflater inflator = context.getLayoutInflater(); 
      view = inflator.inflate(R.layout.listview, null); 
      final ViewHolder viewHolder = new ViewHolder(); 
      viewHolder.memnames = (TextView) view.findViewById(R.id.memname1); 
      viewHolder.ceamount = (EditText) view.findViewById(R.id.expamt1); 
      viewHolder.checkbox = (CheckBox) view.findViewById(R.id.chkbox1); 
      viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, 
                  boolean isChecked) { 
        Model elementc = (Model) viewHolder.checkbox.getTag(); 
        elementc.setSelected(buttonView.isChecked()); 
        boolean edenable = buttonView.isChecked(); 
        if(edenable) 
        { 
         viewHolder.ceamount.setEnabled(true); 
        } else { 
         viewHolder.ceamount.setText(""); 
         viewHolder.ceamount.setEnabled(false); 
        } 
       } 
      }); 

      view.setTag(viewHolder); 
      viewHolder.checkbox.setTag(list.get(position)); 
     } else { 
      view = convertView; 
      ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position)); 
     } 

     ViewHolder holder = (ViewHolder) view.getTag(); 
     holder.memnames.setText(list.get(position).getName()); 
     holder.ceamount.setText(list.get(position).getCeamt()); 
     holder.checkbox.setChecked(list.get(position).isSelected()); 
     return view; 
    } 
} 

Model.Java

package h.pkg.main; 

public class Model { 
    private String name; 
    private String ceexpamt; 
    private boolean selected; 

    public Model(String name, String ceexpamt, boolean selected) { 
     this.name = name; 
     this.ceexpamt = ceexpamt; 
     this.selected = selected; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getCeamt() { 
     return ceexpamt; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public void setCeamt(String ceamt) { 
     this.ceexpamt = ceamt; 
    } 

    public boolean isSelected() { 
     return selected; 
    } 

    public void setSelected(boolean selected) { 
     this.selected = selected; 
    } 

    public void enableEditText() 
    { 

    } 
} 

回答

1

嗨所有的謝謝你的答案..但是,因爲我已經在使用Model類...我試圖通過該示例本身完成任務...請參閱修改的InteractiveArrayAdapter.Java這工作正常保留編輯後正確行中edittext的值。

我剛纔說這個方法..我InterativeArrayAdapter.java

viewHolder.ceamount.setOnFocusChangeListener(new OnFocusChangeListener() { 

      @Override 
      public void onFocusChange(View v, boolean hasFocus) { 
       // TODO Auto-generated method stub 
       if (!hasFocus){ 
        viewHolder.ceamount.setFocusable(true); 
        Model elemente = (Model) viewHolder.ceamount.getTag(); 
        final EditText custamt = (EditText) v; 
        elemente.setCeamt(custamt.getText().toString()); 
       } 
      } 
     }); 

請參見下面的完整代碼..

package h.pkg.main; 
import java.util.HashMap; 
import java.util.List; 

import android.app.Activity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnFocusChangeListener; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.EditText; 
import android.widget.TextView; 

public class InteractiveArrayAdapter extends ArrayAdapter<Model> { 

    private final List<Model> list; 
    private final Activity context; 

    public InteractiveArrayAdapter(Activity context, List<Model> list) { 
     super(context, R.layout.listview, list); 
     this.context = context; 
     this.list = list; 
    } 

    static class ViewHolder { 
     protected TextView memnames; 
     protected EditText ceamount; 
     protected CheckBox checkbox; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = null; 
     if (convertView == null) { 
      LayoutInflater inflator = context.getLayoutInflater(); 
      view = inflator.inflate(R.layout.listview, null); 
      final ViewHolder viewHolder = new ViewHolder(); 
      viewHolder.memnames = (TextView) view.findViewById(R.id.memname1); 
      viewHolder.ceamount = (EditText) view.findViewById(R.id.expamt1); 
      viewHolder.checkbox = (CheckBox) view.findViewById(R.id.chkbox1); 
      viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

         @Override 
         public void onCheckedChanged(CompoundButton buttonView, 
           boolean isChecked) { 
          Model elementc = (Model) viewHolder.checkbox.getTag(); 
          elementc.setSelected(buttonView.isChecked()); 
          boolean edenable = buttonView.isChecked(); 
          if(edenable) 
          { 
          viewHolder.ceamount.setEnabled(true); 
          } 
          else 
          { 
           viewHolder.ceamount.setText(""); 
           viewHolder.ceamount.setEnabled(false); 
          } 


         } 
        }); 

      viewHolder.ceamount.setOnFocusChangeListener(new OnFocusChangeListener() { 

       @Override 
       public void onFocusChange(View v, boolean hasFocus) { 
        // TODO Auto-generated method stub 
        if (!hasFocus){ 
         viewHolder.ceamount.setFocusable(true); 
         Model elemente = (Model) viewHolder.ceamount.getTag(); 
         final EditText custamt = (EditText) v; 
         elemente.setCeamt(custamt.getText().toString()); 
        } 
       } 
      }); 
      view.setTag(viewHolder); 
      viewHolder.memnames.setTag(list.get(position)); 
      //viewHolder.memnames.setId(position); 
      viewHolder.checkbox.setTag(list.get(position)); 
      //viewHolder.checkbox.setId(position); 
      viewHolder.ceamount.setTag(list.get(position)); 
      //viewHolder.ceamount.setId(position); 
     } else { 
      view = convertView; 
      ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position)); 
      ((ViewHolder) view.getTag()).memnames.setTag(list.get(position)); 
      ((ViewHolder) view.getTag()).ceamount.setTag(list.get(position)); 
     } 

     ViewHolder holder = (ViewHolder) view.getTag(); 
     holder.memnames.setText(list.get(position).getName()); 
     holder.ceamount.setText(list.get(position).getCeamt()); 
     holder.checkbox.setChecked(list.get(position).isSelected()); 
     return view; 
     } 
} 
0

在您的適配器,使用Map<Integer,Boolean>Map<Integer,String>存儲複選框的狀態和editText的值

+0

您好我不知道如何實現地圖..你能否提供任何示例代碼? – 2012-08-03 09:40:09

0

Map是兩個數據類型之間的鏈接,因此從Integer到Boolean的映射是從特定整數值到相應布爾值(1 - > true,2 - > false等)的一對一功能。 )所以這基本上可以讓你爲每個列表位置維護一個「映射」到複選框的狀態。 在Java中實現一個地圖的方法是這樣的:

Map<Integer,Boolean> listMap = new HashMap<Integer,Boolean>(); 

,當你想從一個列表元素添加映射到它的布爾狀態,那麼你就必須使用此代碼:

listMap.put(yourListPositionInIntValue, statusOfCheckboxInTrueOrFalse); 

並且當您希望修改映射中的布爾值時,您只需要使用相同的ListPosition和更新的布爾值重複上述代碼行。