3

我有一個ListView其中每個項目包含多個EditTexts。我正在定義一個比例尺,因此其中一個EditTexts依賴於上述項目中的EditText。在下面的示例中,B設置爲與A相同的值,當時A已被編輯。因此,用戶實際上並未使用右欄。如何在列表項中的EditText中更新ListView而不失焦點? (Android)

我能聽事件一個和更新,並相應地調用notifyDataSetChanged(),但後來我失去了我的EditText的焦點,ListView控件重繪。

enter image description here

底線,我要的是:

編輯字段一個,當我再現場挖掘Ç,我想一個的價值申請到B,我想專注於C

這是我關注的「關注C」部分。

p.s.實際上,該行上有另一個EditText,因此焦點並不總是會出現在具有A和C的列上。

編輯:這是我的適配器的getItemId()方法,以幫助回答@ aniv的評論。

@Override 
    public Object getItem(int arg0) { 
     return arg0; 
    } 

EDIT_2:覆蓋hasStableIds()返回true後,它的偉大工程,當我從一個的第三列中的其他項目,而不是當我從啓程Ç。我認爲我的onFocusChange重寫正在搞亂一些東西,因爲它在更改該列中的焦點時(在共享相同的onFocusChange方法時)的行爲很奇怪。這是我的自定義onFocusChangeListener。

private class MyFocusChangeListener implements View.OnFocusChangeListener{ 
    private EditText et; 
     private ScaleItem item; 
     private Integer pos; 

     private MyFocusChangeListener(ScaleItem item, Integer pos){ 
      this.item = item; 
      this.pos = pos; 
     } 

     @Override 
     public void onFocusChange(View v, boolean hasFocus){ 
      if(!hasFocus){ 
       et = (EditText) v; 
       Activity_EditCourseGPA a = (Activity_EditCourseGPA) activity; 
       a.updateMaxOnTextChange(item, pos, et.getText().toString()); 
      } else { 

      } 
     } 
} 

它指的是在我的活性的功能(使用的EditText字段來更新基礎數據)....

public void updateMaxOnTextChange(ScaleItem item, Integer pos, String str){ 
    if(pos < scaleItems.size()){ 
     scaleItems.get(pos + 1).setMax(Double.valueOf(str)); 
     scaleListAdapter.notifyDataSetChanged(); 
    } 
} 

我使用的EditText位置和內容在更新的基礎數據相同的位置。以下是我在同一列中更改焦點時發生的情況的一瞥。很奇怪。

enter image description here

+0

您的適配器是否有穩定的ID? – alanv 2014-10-19 23:41:06

+0

@alanv你是什麼意思的穩定ID?我的適配器擴充了一個佈局xml,其中包含唯一標識的視圖。 – NSouth 2014-10-19 23:42:21

+0

您的適配器是否從hasStableIds()返回true並從getItemId(int)返回一致的值? – alanv 2014-10-19 23:43:55

回答

0

首先,你需要一個自定義類Grade

public class GradeInfo { 
    boolean enabled; 
    String gpa, perc1, perc2; 
} 

你需要創建一個List<GradeInfo>對象將包含GradeInfo對象,分別代表一排列表。你可以在你的listview的適配器中使用這個List。您的適配器將是這樣的:

private class GradeAdap extends BaseAdapter { 

    @Override 
    public int getCount() { 
     return gradeList.getSize(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return gradeList.get(position); 
    } 

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

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

     if(convertView == null) 
      convertView = getLayoutInflater().inflate(R.layout.row_grade, null); 

     return loadGradeRow(convertView, position); 
    } 
} 

是,適配器的getView方法調用另一個方法loadGradeRow

private View loadGradeRow(final View rowView, final int position) { 
    CheckBox chk= (CheckBox) rowView.findViewById(R.id.chk); 
    ...// Declare and initialize other views 

    listIsRefreshing = true; // Explained below 
    chk.setChecked(gradeList.get(position).enabled); 
    ...// set views accordingly 
    listIsRefreshing = false; 

    txtGpa.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) {     
     } 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) {      
     } 
     @Override 
     public void afterTextChanged(Editable s) { 

      if(listIsRefreshing) //JUST REFRESHING, DON'T MIND 
       return; 

      gradeList.get(position).perc1 = s.toString(); 

      if(position == gradeList.size()-1) //Dont assign if its the last row 
       return; 


      gradeList.get(position+1).perc2 = s.toString(); 

      loadGradeRow(listview.getChildAt(position+1), position+1); 
     } 
    }); 

} 

listIsRefreshing是需要在您的活動被宣佈一個布爾值。只有當用戶手動輸入值時,才需要確保將值分配給perc2

相關問題