3

ListView 각 항목에 복수 EditTexts가 들어 있습니다. 저울을 정의하고 있으므로 EditText 중 하나는 위의 항목에있는 EditText에 종속됩니다. 아래 예제에서 BA과 같으며, A을 편집 할 때 값으로 설정됩니다. 따라서 사용자는 실제로 오른쪽 열을 사용하지 않습니다.목록 항목의 EditText에서 포커스를 잃지 않고 ListView를 업데이트하려면 어떻게해야합니까? (안드로이드)

나는 에서 이벤트를 수신하고 B를 업데이트하고 그에 따라 notifyDataSetChanged()를 호출 할 수있어,하지만 ListView를 다시 그릴로 나는 내 글고의 초점을 잃게됩니다.

편집 필드 내가 다음 필드 에 C을 누를 때, 나는 적용 의 값을 싶습니다

enter image description here

결론은, 내가 원하는 것입니다 B으로 이동하고 C으로 이동하는 데 집중하고 싶습니다.

문제가있는 것은 "C 포커스입니다"부분입니다.

p.s. 실제로 행에 다른 EditText가 있으므로 포커스가 항상 A 및 C가있는 열로 이동하지는 않습니다.

편집 : @ aniv의 의견에 도움을주기 위해 어댑터의 getItemId() 메서드가 있습니다.

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

EDIT_2 : true를 반환하는 hasStableIds()를 오버라이드 (override) 한 후, 내가 다른 항목에서 세 번째 열에 에서 갈 때 좋은 작품,하지만 내가 에서 갈 때에 C. 나는 내 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 { 

      } 
     } 
} 

내 활동을 참조하는 함수

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

난에서 기본 데이터를 업데이트 글고 위치 및 콘텐츠 사용 .... (기본 데이터를 업데이트 글고 필드를 사용) 같은 위치. 동일한 칼럼 내에서 포커스를 변경하면 어떻게 될지 한 번 볼 수 있습니다. 엄청 이상해.

enter image description here

+0

어댑터에 안정적인 ID가 있습니까? – alanv

+0

@alanv 안정 ID로 정확히 무엇을 의미합니까? 내 어댑터는 고유하게 식별 된보기를 포함하는 레이아웃 xml을 확장합니다. – NSouth

+0

어댑터가 hasStableIds()에서 true를 반환하고 getItemId (int)에서 일관된 값을 반환합니까? – alanv

답변

0

첫째, 당신은 당신이 GradeInfo 객체 행을 나타내는 각각의 목록을 포함하는 List<GradeInfo> 객체를 생성 할 필요가 Grade

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

사용자 정의 클래스를해야합니다. 목록보기의 어댑터에서이 목록을 사용할 수 있습니다.어댑터는 다음과 같이 표시됩니다

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이 활동에 선언 할 필요가 부울입니다 :

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 호출합니다. 사용자가 값을 수동으로 입력 한 경우에만 값이 perc2에 할당되도록해야합니다.

관련 문제