2012-02-27 65 views
0

我正在使用自定義基礎適配器來實現customListView。 listView類(擴展ListView)在主活動中的鰭狀肢flipper.addView(mListView)內使用。EditText.SetText()更改自定義適配器中的我的軟鍵盤輸入類型

列表視圖有3種類型的行。 列表中的第一行是一個包含微調的行,接下來的兩行是帶有edittext的行,其中輸入了文本。第三行及其後的所有內容都與編輯文本中的數字相同。 我想這樣做,所以當我點擊文本版本時,softkeypad將只顯示文本,數字版本則顯示手機按鍵。
它們顯示正常,但是當你點擊一個編輯文本時,問題就出現了,softkeyboard在手機格式中彈出。 這是在getView()中設置的所有設置和值,但是當軟鍵盤以手機格式彈出時,getView()會再次被調用(邏輯),但只要它碰到文本類型EditTexts中的一個,鍵盤類型就會切換回文本輸入。在那之後,它不會輕易地轉變爲手機風格的顯示。該視圖似乎在跳,並努力專注於EditText我想 我真的迷失在這裏,無法弄清楚這一點。這裏是代碼的2個主要部分。

public class MethodEditorAdapter extends BaseAdapter{ 

private Context context; 
private ArrayList<String[]> scanparam; 

private LayoutInflater mInflater; 

public MethodEditorAdapter(Context context, ArrayList<String[]> scanparam) { 
    super(); 
    this.scanparam = scanparam; 
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

} 
@Override 
public long getItemId(int position) { 
    int i = 0; 
    if(position == 0) i = 0; 
    if(position ==1) i = 1;   
    if(position == 2)i = 1; 
    if (position > 2)i = 2; 
    return i; 
} 
@Override 
public int getViewTypeCount() { 
    return 3; 
} 

@Override 
public int getItemViewType(int position) { 
    int i = 0; 
    if(position == 0) i = 0; 
    if(position ==1) i = 1;   
    if(position == 2)i = 1; 
    if (position > 2)i = 2; 
    return i; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 

    Formatnames(position); 
    View rowView = convertView; 
    ViewHolder holder = null; 
    int type = getItemViewType(position); 

    if (rowView == null) { 

     holder = new ViewHolder(); 
     switch (type) { 
     case 0: 
      rowView = mInflater.inflate(R.layout.method_editor_row_spin, null); 
      holder.paramname = (TextView) rowView.findViewById(R.id.techniquetag); 
      holder.techniquespinner = (Spinner) rowView.findViewById(R.id.techniquespinner); 
      break; 
     case 1: 
      rowView = mInflater.inflate(R.layout.method_editor_row_text, null); 
      holder.paramname = (TextView) rowView.findViewById(R.id.paramnameT); 
      holder.paramvalue = (EditText) rowView.findViewById(R.id.paramvalT); 
      break; 
     case 2: 
      rowView = mInflater.inflate(R.layout.method_editor_row_number, parent, false); 
      holder.paramnameNum = (TextView) rowView.findViewById(R.id.paramnameN); 
      holder.paramvalueNum = (EditText) rowView.findViewById(R.id.paramvalN); 
      break; 
     } 
     rowView.setTag(holder); 


    }else { 
     holder = (ViewHolder) rowView.getTag(); 
    } 

    setSelectedPosition(position); 


    switch (type) { 
    case 0: 
     holder.paramname.setText(namestg + " " + nd); 
     holder.techniquespinner.setSelection(Integer.valueOf(scanparam.get(position)[1])); 
     break; 
    case 1: 
     holder.paramname.setText(namestg + " " + nd); 
     holder.paramvalue.setText(scanparam.get(position)[1]); 
     break; 
    case 2: 
    holder.paramnameNum.setText(namestg + " " + nd); 
    holder.paramvalueNum.setText(scanparam.get(position)[1]); 
    } 

    return rowView; 
} 

static class ViewHolder { 
    public TextView paramname; 
    public EditText paramvalue; 
    public Spinner techniquespinner; 
    public TextView paramnameNum; 
    public EditText paramvalueNum; 

} 

主視圖

public class MethodEditorView extends ListView { 

private ArrayList<String[]> thismethod = new ArrayList<String[]>(); 

public MethodEditorAdapter editorAdapter; 

private ListView mListView; 

private Context mContext; 

public MethodEditorView(Context context, ArrayList<String[]> methodlist) { 
    super(context); 
    // TODO Auto-generated constructor stub 
    this.thismethod = methodlist; 
    mContext = context;enter code here 
initview(context); 
} 

private void initview(Context context){ 
    editorAdapter = new MethodEditorAdapter(context, thismethod); 
    this.setAdapter(editorAdapter); 

} 

}

的XML,對不起,我不能正確插入。這是數字類型。

<?xml version="1.0" encoding="utf-8"?> 
<TableRow xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_height="wrap_content" android:layout_weight="1" android:layout_width="fill_parent" android:id="@+id/methodrownumber"> 
    <TextView android:layout_height="wrap_content" android:layout_weight="1" android:textSize="16sp" android:textStyle="bold" android:id="@+id/paramnameN" android:layout_width="fill_parent" android:padding="5dp"></TextView> 
    <EditText android:layout_height="wrap_content" android:layout_width="fill_parent" android:textSize="16sp" android:layout_weight="1" android:id="@+id/paramvalN" android:imeOptions="actionNext" android:inputType="phone" android:focusable="true" android:focusableInTouchMode="true" android:clickable="true"></EditText> 

回答

1

讓我爲您節省大量的頭痛在你的列表視圖的EditText。不要這樣做。我花了一個多星期的時間試圖在listview中獲得edittext,以避免重複使用輸入,以確保當你開始使用時正確的輸入是正確的。我建議在一天結束時使用看起來像列表視圖的tablelayout進行滾動視圖。只要你沒有大量的行,這將工作並運行良好。現在如果讓我們說你有100行,不會很漂亮。

public class inputpage extends Activity implements OnClickListener{ 

     public TableLayout tl; 
     static Map<Integer, String> inputValues = new LinkedHashMap<Integer, String>(); 
     private dbadapter mydbhelper; 
     public static int editCount; 
     private PopupWindow pw; 
     public Cursor cursor; 
     private ArrayList<EditText> m_edit = new ArrayList<EditText>(); 

     @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     mydbhelper = new dbadapter(this); 
     mydbhelper.open(); 
     setContentView(R.layout.tablelayout); 
     tl=(TableLayout) this.findViewById(R.id.table); 
     getCursor(); 
     editCount = cursor.getCount(); 
     buildRow(); 

     View footer = getLayoutInflater().inflate(R.layout.footer_layout, null); 
     tl.addView(footer); 





     } 
//This lets me get a cursor so I can settext on my textviews 
     public void getCursor(){ 
     if(main.quickStart == "Cate"){ 
      cursor = mydbhelper.getUserWord(); 
     }... 

      //add my rows in a loop based off how many items my cursor brought back 
     public void buildRow(){ 
      //params for my different items 
      LayoutParams textparam = new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT, .30f); 
      LayoutParams editparam = new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT, .70f); 
      textparam.setMargins(2, 2, 2, 2); 
      editparam.setMargins(2, 2, 2, 2); 
      editparam.gravity=17; 
      LayoutParams rowparam = new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT); 
      cursor.moveToFirst(); //make sure cursor starts at beginning 
      for (int i = 0; i < editCount; i++){ 
       TableRow tr = new TableRow(this); 
       tr.setLayoutParams(rowparam); 

       //textview 
       TextView tv=new TextView(this); 
       tv.setLayoutParams(textparam); 
       tv.setText(cursor.getString(cursor.getColumnIndex("userword"))); 
       tv.setTextSize(35f); 
       tv.setGravity(Gravity.CENTER); 
       tv.setWidth(175); 
       tv.setTextColor(getResources().getColor(R.color.black)); 
       tr.addView(tv); 

       //edittext 
       EditText edit = new EditText(this); 
       edit.setLayoutParams(editparam); 
       tr.addView(edit); 
       edit.setGravity(Gravity.LEFT); 
       edit.setId(editCount); 
       m_edit.add(i, edit); 
       edit.setText(""); 

       cursor.moveToNext(); 
       tl.addView(tr, new TableLayout.LayoutParams(TableLayout.LayoutParams.FILL_PARENT, TableLayout.LayoutParams.WRAP_CONTENT)); 
      }} 

希望這會有所幫助,併爲您節省很多麻煩。順便說一句,我建立了我可以在XML(tablelayout,頁腳等),只是通過Java使我的錶行。

+0

對不起,延遲迴復,個人原因。我喜歡這個想法,我的列表長度不超過20行。但我忘了提及我動態構建它,因爲我有大約12個不同的列表視圖,每個列表視圖都有不同的佈局,所以我只是回收行。我在 – user960914 2012-03-02 09:13:57

+0

下面發佈了另一個替代方案,見下面我在最後使用了ScrollView – user960914 2012-07-17 11:09:58

3

經過幾天和幾天這裏是我的解決方案,爲流暢的可編輯列表視圖。 您必須設置兩項絕對至關重要的功能,才能讓它們始終保持工作和可編輯性,而不會失去焦點。

最關鍵的一個是。 在清單

<activity android:name=".youractivity" android:windowSoftInputMode="adjustPan"/> 

然後 在ListView的XML

android:descendantFocusability="beforeDescendants" 

mListView.setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS); 

這最後的1只是放大列表視圖以開放的編輯過的任何頂部列表視圖之外的其他視圖,例如操作欄。很好的一個小屏幕! 在這次對話中發現stackoverflow link

+0

我打算把自己的答案投下來,因爲帶有focusables的ListViews很好......廢話。不要做他們!! ScrollView絕對是前進的方向,我實現了一個自定義的「BaseAdapter」風格類,以用我的行填充scrollview。 – user960914 2012-07-17 11:07:44