0

내 확장 가능 목록 뷰에서 각 하위 뷰에 EditText가 있으므로 각 텍스트 업데이트에서 모델을 업데이트해야하므로 각 EditText에 텍스트 워처를 추가하려고했습니다. 그러나 TextWatchers와 함께 사용할 때 내 모델은 그룹 & 하위 위치에서 잘못된 값으로 입력됩니다. 확장 가능 목록 뷰에서 불필요한 변경을 초래하는 텍스트 워처

내 어댑터 코드

package dularish.splitspends; 

    import android.content.Context; 
    import android.text.Editable; 
    import android.text.TextWatcher; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.view.animation.Animation; 
    import android.view.animation.AnimationUtils; 
    import android.widget.BaseExpandableListAdapter; 
    import android.widget.EditText; 
    import android.widget.ExpandableListView; 
    import android.widget.ImageButton; 

    import java.util.List; 

    /** 
    * Created by pc on 11/3/2017. 
    */ 

    public class ExpandableListAdapter extends BaseExpandableListAdapter { 

     public List<CardViewModel> models; 
     public Context ctx; 
     public ExpandableListView listviewref; 



     public ExpandableListAdapter(List<CardViewModel> models, Context ctx, ExpandableListView expandableListView) { 
      this.models = models; 
      this.ctx = ctx; 
      this.listviewref = expandableListView; 
     } 

     @Override 
     public int getGroupCount() { 
      return models.size(); 
     } 

     @Override 
     public int getChildrenCount(int groupPosition) { 
      return models.get(groupPosition).getInnerModelsData().size(); 
     } 

     @Override 
     public Object getGroup(int groupPosition) { 
      return models.get(groupPosition); 
     } 

     @Override 
     public Object getChild(int groupPosition, int childPosition) { 
      return models.get(groupPosition).getInnerModelsData().get(childPosition); 
     } 

     @Override 
     public long getGroupId(int groupPosition) { 
      return groupPosition; 
     } 

     @Override 
     public long getChildId(int groupPosition, int childPosition) { 
      return childPosition; 
     } 

     @Override 
     public boolean hasStableIds() { 
      return false; 
     } 

     @Override 
     public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { 


      String Name = models.get(groupPosition).getName(); 
      String Amount = models.get(groupPosition).getAmount().toString(); 
      if(convertView == null){ 
       LayoutInflater layoutInflater = (LayoutInflater) this.ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       convertView = layoutInflater.inflate(R.layout.parent_cardview,null); 
      } 
      EditText namebox = (EditText) convertView.findViewById(R.id.namebox); 
      EditText amountbox = (EditText) convertView.findViewById(R.id.amountbox); 
      ImageButton dropdownbutton = (ImageButton) convertView.findViewById(R.id.dropdownbutton); 
      namebox.setText(Name); 
      amountbox.setText(Amount); 
      //listviewref.expandGroup(groupPosition);//This comment should remind you that on every refresh this method would be executed 
      dropdownbutton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if(listviewref.isGroupExpanded(groupPosition)){ 
         System.out.println("Group Collapsed"); 
         Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(ctx, R.anim.imagebutton_rotate_back); 
         hyperspaceJumpAnimation.setFillAfter(true); 
         v.startAnimation(hyperspaceJumpAnimation); 
         listviewref.collapseGroup(groupPosition); 
        } 
        else{ 
         System.out.println("Group expanded"); 
         Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(ctx, R.anim.imagebutton_rotate); 
         hyperspaceJumpAnimation.setFillAfter(true); 
         v.startAnimation(hyperspaceJumpAnimation); 
         listviewref.expandGroup(groupPosition); 
        } 

       } 
      }); 

      return convertView; 
     } 

     @Override 
     public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 

      String SubAmount = models.get(groupPosition).getInnerModelsData().get(childPosition).getInnerAmount().toString(); 
      String Purpose = models.get(groupPosition).getInnerModelsData().get(childPosition).getPurpose(); 

      if(convertView == null){ 
       LayoutInflater layoutInflater = (LayoutInflater) this.ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       convertView = layoutInflater.inflate(R.layout.child_cardview,null); 
      } 
      EditText subamountbox = (EditText) convertView.findViewById(R.id.subamountbox); 
      EditText purposebox = (EditText) convertView.findViewById(R.id.purposebox); 
      ImageButton addchildbutton = (ImageButton) convertView.findViewById(R.id.inneraddbutton); 
      ImageButton deletechildbutton = (ImageButton) convertView.findViewById(R.id.innerdeletebutton); 
      subamountbox.setText(SubAmount); 
      purposebox.setText(Purpose); 
      System.out.println("Child set for GroupPosition - " + groupPosition + " ChildPosition - " + childPosition + " Amt " + SubAmount + " Purpose " + Purpose); 

      addchildbutton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        System.out.println("AddChild button clicked"); 
        models.get(groupPosition).addInnerModelsData(new InnerCardViewModel(60,"DefaultAddChild")); 
        notifyDataSetChanged(); 
       } 
      }); 

      subamountbox.addTextChangedListener(new TextWatcher() { 

       @Override 
       public void beforeTextChanged(CharSequence s, int start, int count, int after) 
       { 

       } 

       @Override 
       public void onTextChanged(CharSequence s, int start, int before, int count) { 

       } 

       @Override 
       public void afterTextChanged(Editable s) { 
        System.out.println("TextChanged for GroupPosition - " + groupPosition + " ChildPosition - " + childPosition + " Amt " + s.toString()); 
       models.get(groupPosition).getInnerModelsData().get(childPosition).setInnerAmount(Integer.parseInt(String.valueOf(s))); 
        //notifyDataSetChanged(); 

       } 
      });/* 
      purposebox.addTextChangedListener(new TextWatcher() { 
       @Override 
       public void beforeTextChanged(CharSequence s, int start, int count, int after) 
       { 

       } 

       @Override 
       public void onTextChanged(CharSequence s, int start, int before, int count) { 

       } 

       @Override 
       public void afterTextChanged(Editable s) { 
        models.get(groupPosition).getInnerModelsData().get(childPosition).setPurpose(s.toString()); 
       } 
      }); 
    */ 
      return convertView; 
     } 

     @Override 
     public boolean isChildSelectable(int groupPosition, int childPosition) { 
      return true; 
     } 
    } 

않습니다 Subamount 글고 치기위한 TextWatcher없이 내 콘솔 출력입니다 : 이것은 TextWatchers 내 콘솔 출력이

11-04 08:19:52.138 30714-30714/dularish.splitspends I/System.out: Group expanded 
    11-04 08:19:52.154 30714-30714/dularish.splitspends I/System.out: Child set for GroupPosition - 0 ChildPosition - 0 Amt 1500 Purpose Default 
    11-04 08:19:52.157 30714-30714/dularish.splitspends I/System.out: Child set for GroupPosition - 0 ChildPosition - 1 Amt 50 Purpose Trial2 
    11-04 08:19:52.166 30714-30714/dularish.splitspends I/System.out: Child set for GroupPosition - 0 ChildPosition - 0 Amt 1500 Purpose Default 
    11-04 08:19:52.174 30714-30714/dularish.splitspends I/System.out: Child set for GroupPosition - 0 ChildPosition - 1 Amt 50 Purpose Trial2 
    11-04 08:19:55.548 30714-30714/dularish.splitspends I/System.out: AddChild button clicked 
    11-04 08:19:55.561 30714-30714/dularish.splitspends I/System.out: Child set for GroupPosition - 0 ChildPosition - 0 Amt 1500 Purpose Default 
    11-04 08:19:55.563 30714-30714/dularish.splitspends I/System.out: Child set for GroupPosition - 0 ChildPosition - 1 Amt 50 Purpose Trial2 
    11-04 08:19:55.565 30714-30714/dularish.splitspends I/System.out: Child set for GroupPosition - 0 ChildPosition - 2 Amt 60 Purpose DefaultAddChild 
    11-04 08:19:55.572 30714-30714/dularish.splitspends I/System.out: Child set for GroupPosition - 0 ChildPosition - 0 Amt 1500 Purpose Default 
    11-04 08:19:55.574 30714-30714/dularish.splitspends I/System.out: Child set for GroupPosition - 0 ChildPosition - 1 Amt 50 Purpose Trial2 
    11-04 08:19:55.575 30714-30714/dularish.splitspends I/System.out: Child set for GroupPosition - 0 ChildPosition - 2 Amt 60 Purpose DefaultAddChild 

이다가

11-04 08:16:17.860 27184-27184/dularish.splitspends I/System.out: Group expanded 
    11-04 08:16:17.885 27184-27184/dularish.splitspends I/System.out: Child set for GroupPosition - 0 ChildPosition - 0 Amt 1500 Purpose Default 
    11-04 08:16:17.888 27184-27184/dularish.splitspends I/System.out: TextChanged for GroupPosition - 0 ChildPosition - 0 Amt 50 
    11-04 08:16:17.889 27184-27184/dularish.splitspends I/System.out: Child set for GroupPosition - 0 ChildPosition - 1 Amt 50 Purpose Trial2 
    11-04 08:16:17.897 27184-27184/dularish.splitspends I/System.out: TextChanged for GroupPosition - 0 ChildPosition - 0 Amt 50 
    11-04 08:16:17.897 27184-27184/dularish.splitspends I/System.out: TextChanged for GroupPosition - 0 ChildPosition - 1 Amt 50 
    11-04 08:16:17.897 27184-27184/dularish.splitspends I/System.out: Child set for GroupPosition - 0 ChildPosition - 0 Amt 50 Purpose Default 
    11-04 08:16:17.906 27184-27184/dularish.splitspends I/System.out: Child set for GroupPosition - 0 ChildPosition - 1 Amt 50 Purpose Trial2 
    11-04 08:16:37.699 27184-27184/dularish.splitspends I/System.out: AddChild button clicked 
    11-04 08:16:37.717 27184-27184/dularish.splitspends I/System.out: Child set for GroupPosition - 0 ChildPosition - 0 Amt 50 Purpose Default 
    11-04 08:16:37.719 27184-27184/dularish.splitspends I/System.out: TextChanged for GroupPosition - 0 ChildPosition - 0 Amt 50 
    11-04 08:16:37.720 27184-27184/dularish.splitspends I/System.out: Child set for GroupPosition - 0 ChildPosition - 1 Amt 50 Purpose Trial2 
    11-04 08:16:37.722 27184-27184/dularish.splitspends I/System.out: TextChanged for GroupPosition - 0 ChildPosition - 0 Amt 60 
    11-04 08:16:37.722 27184-27184/dularish.splitspends I/System.out: TextChanged for GroupPosition - 0 ChildPosition - 1 Amt 60 
    11-04 08:16:37.722 27184-27184/dularish.splitspends I/System.out: Child set for GroupPosition - 0 ChildPosition - 2 Amt 60 Purpose DefaultAddChild 
    11-04 08:16:37.731 27184-27184/dularish.splitspends I/System.out: TextChanged for GroupPosition - 0 ChildPosition - 0 Amt 60 
    11-04 08:16:37.731 27184-27184/dularish.splitspends I/System.out: TextChanged for GroupPosition - 0 ChildPosition - 1 Amt 60 
    11-04 08:16:37.731 27184-27184/dularish.splitspends I/System.out: TextChanged for GroupPosition - 0 ChildPosition - 0 Amt 60 
    11-04 08:16:37.732 27184-27184/dularish.splitspends I/System.out: Child set for GroupPosition - 0 ChildPosition - 0 Amt 60 Purpose Default 
    11-04 08:16:37.733 27184-27184/dularish.splitspends I/System.out: TextChanged for GroupPosition - 0 ChildPosition - 1 Amt 60 
    11-04 08:16:37.734 27184-27184/dularish.splitspends I/System.out: Child set for GroupPosition - 0 ChildPosition - 1 Amt 60 Purpose Trial2 
    11-04 08:16:37.735 27184-27184/dularish.splitspends I/System.out: TextChanged for GroupPosition - 0 ChildPosition - 0 Amt 60 
    11-04 08:16:37.735 27184-27184/dularish.splitspends I/System.out: TextChanged for GroupPosition - 0 ChildPosition - 1 Amt 60 
    11-04 08:16:37.735 27184-27184/dularish.splitspends I/System.out: TextChanged for GroupPosition - 0 ChildPosition - 2 Amt 60 
    11-04 08:16:37.736 27184-27184/dularish.splitspends I/System.out: Child set for GroupPosition - 0 ChildPosition - 2 Amt 60 Purpose DefaultAddChild 

참고 : UI에서 EditText에 대한 데이터를 변경하지 않았습니다.

내 TextWatchers 구현 방법이 잘못 되었습니까? 아니면 Adapter에 문제가 있습니까? 해당 그룹 & 하위 위치에 대해서만 TextWatcher를 업데이트하겠다는 점을 분명히 언급했지만, 그들은 혼란스러워지고 있습니다.

또 하나의 관찰, 나는 'getChildView'에서 convertView 모든 childViews에 대한보기를 반환합니다 생각합니다. convertview에서 TextChangedListener를 보도록 설정 했으므로 문제가 발생할 수 있습니까?

답변

0

부울 유형의 부울 목록을 데이터 기본값으로 바인딩합니다. 부울 false 사용자가보기를 선택하면 위치가 true로 설정되어 위치를 감지하고 위치에 따라 작업 할 수 있습니다.

Integer Pos = Integer.parseInt(holder.edittext.getTag().toString()); 

: 또한

이 같은 위치를 얻을 -1과 같은 XML 설정 편집 텍스트 태그 태그와 함께 할 활동에 데이터를 바인딩하면서 그것은 사용자의 클릭으로 부울을 추가하거나 위치를 선택할 수 있습니다 선택한 위치에 따라 작업하면 선택한 것을 제외한 다른 모든보기가 작동하지 않습니다.

Select checkbox is duplicated when scrolling on an ExpandableListView

:

또한, 본 실시 예를 점검

관련 문제