2011-10-14 2 views
4

내 listview에서 실제로 이상한 일이 발생했습니다. ButtonView와 EditText를 사용하여 ListView를 만들고 있습니다.목록보기의 중복 레이아웃 참조

[Button] [EditText] [Button], 버튼은 EditText의 수치를 클릭당 1 단위로 업데이트하는 "incrementer"및 "decrementer"와 같이 작동합니다. 문제는 버튼을 클릭 할 때마다 다른 목록보기 요소의 editText가 변경 될 때마다 (클릭 된 항목의 editText도 변경됨)입니다. 그리고이 잘못된 변경된 항목의 버튼을 클릭하면 첫 번째 항목의 editText도 변경됩니다. 기본적으로 버튼과 editText에 대한 동일한 참조가 있지만 데이터가있는 textView가 있지만이 데이터는 서로 다릅니다.

는 내가 만든 사용자 정의 어댑터 것을 달성하기 :
@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     if(convertView == null) { 
      convertView = mInflater.inflate(R.layout.lastproduct_row, null); 
      holder = new ViewHolder(); 
      holder.btnAddQtd = (Button) convertView.findViewById(R.lastproduct_row.btn_add_qtd); 
      holder.btnSubQtd = (Button) convertView.findViewById(R.lastproduct_row.btn_sub_qtd); 
      holder.etQuantidade = (EditText) convertView.findViewById(R.lastproduct_row.et_quantidade);     

      TextView tv; 

      holder.tvList = new TextView[PRODUCTROW_INT_KEY.length]; 

      for(int i = 0; i < PRODUCTROW_INT_KEY.length; i++) { 
       tv = (TextView) convertView.findViewById(PRODUCTROW_INT_KEY[i]); 
       holder.tvList[i] = tv;     
      } 

      convertView.setTag(holder); 
     } 
     else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     HashMap<String, String> hm = productsList.get(position); 
     String key = hm.get(CODIGO_KEY); 

     for(int i = 0; i < PRODUCTROW_INT_KEY.length; i++) { 
      holder.tvList[i].setText(hm.get(PRODUCTROW_STR_KEY[i])); 
     } 

     holder.btnAddQtd.setTag(key+QTD_FLAG+ADD_ACTION); 
     holder.btnSubQtd.setTag(key+QTD_FLAG+SUB_ACTION); 
     holder.btnAddQtd.setOnClickListener(handle); 
     holder.btnSubQtd.setOnClickListener(handle); 

     if(novosEstoques.containsKey(key)) { 
      holder.etQuantidade.setText(MyParseFunctions.parseCentesimal(novosEstoques.get(key).getQuantidade())); 
     } 

     return convertView; 
    } 

    class ViewHolder { 
     private TextView []tvList; 
     private Button btnAddQtd, btnSubQtd; 
     private Button btnAddQtVol, btnSubQtVol; 
     private EditText etQuantidade, etQtVolume; 
    } 

나는 (다른 정보와 연결) 내 목록보기 요소 ID와 함께 자신의 태그를 설정, 버튼에 온 클릭 listenners을 추가했다. 그럼 내 이벤트 리스너에 난 그냥 버튼 부모보기 (AN있는 LinearLayout)를받을 수 있도록 사용 getViewAt()에서 글고 치기를 얻을 : 내가있는 LinearLayout 인스턴스가 있는지 확인하기 위해이 예에서 setBackgroundColor을 사용하고

@Override 
    public void onClick(View v) { 
     String tag = (String) v.getTag(); 

     if(tag.contains(QTD_FLAG)) { 
      String []info = ((String) v.getTag()).split(QTD_FLAG); 
      float qtd; 
      LinearLayout ll = (LinearLayout) v.getParent(); 
      ll.setBackgroundColor(Color.rgb(0, 128, 30)); 
      EditText et = (EditText) ll.getChildAt(2); 

      qtd = Float.parseFloat(et.getText().toString().replace(",", ".")); 

      if(info[1].equals(ADD_ACTION)) { 
       qtd++; 

      } 
      else if(info[1].equals(SUB_ACTION)) { 
       if(qtd > 0) 
        qtd--; 
      } 

      Log.d("TESTE", "MODIFICAR KEY = "+info[0]); 
      et.setText(qtd+""); 
     }   
    } 

lisView에서 중복되었습니다. 버튼을 클릭하면 2 개의 다른 목록보기 항목으로 그려집니다.

누구든지이 일을 할 수 있음을 나에게 지적 할 수 있습니까? 중복 된 ListView 항목이있는 사람들을 찾았습니다. 그 경우 내 ListView에 TextView가 있고 그 수가 같지 않습니다. 버튼이있는 LinearLayout 부분과 editText 만 "공유 됨"입니다.


getView 메소드에서 몇 가지 사항을 변경 했으므로 이제 작동 중입니다! getView 메소드가 호출 될 때마다 내 editText가 제대로 채워질 것이라는 것을 전혀 보장하지 못했고 그 사실을 알지 못했던 것 같습니다. 그래서 getView를 호출 할 때마다 editText 값을 설정합니다. 사용자가 ET 값을 편집하는 경우 getView에서 복원하기 위해 HashMap에 저장하고, 주어진 editText에 대해 HashMap에 항목이 없으면 기본값으로 설정합니다. 값 (영) :

... 
    if(convertView == null) { 
      holder = new ViewHolder(); 
      holder.btnAddQtd = (Button) convertView.findViewById(R.lastproduct_row.btn_add_qtd); 
      holder.btnSubQtd = (Button) convertView.findViewById(R.lastproduct_row.btn_sub_qtd); 
      holder.etQuantidade = (EditText) convertView.findViewById(R.lastproduct_row.et_quantidade); 

      //Now it is easier to get etQuantidade reference in button 
      //click handle, I just have to do: 
      // public onClick(View v) { 
      //  EditText etButtonAssociated = (EditText) v.getTag(); 
      //  ... 
      // } 
      holder.btnAddQtd.setTag(holder.etQuantidade); 
      holder.btnSubQtd.setTag(holder.etQuantidade); 

      holder.btnAddQtd.setOnClickListener(handle); 
      holder.btnSubQtd.setOnClickListener(handle); 
      ... 
    } 
    else { 
     ... 
    } 
    holder.etQuantidade.setTag(key); 

    if(novosEstoques.containsKey(key)) { 
     holder.etQuantidade.setText(MyParseFunctions.parseCentesimal(novosEstoques.get(key).getQuantidade())); 
    } 
    else { 
     holder.etQuantidade.setText("0"); 
    } 

    return convertView; 
+0

어디에서 "et"를 얻을 수 있습니까? –

+0

StackOverflow에 가입 해 주셔서 감사합니다. 귀하의 질문은 잘 정리되어 있으므로 답변을 얻는 방법에 대해 알아 보도록하겠습니다. :) –

+0

@mozarty 나는이 줄로하고있다 : EditText et = (EditText) ll.getChildAt (2); – IPValverde

답변

0

이스라엘,

코드를 찾고 후, 나는 당신이 만든 구현 결정에 대해 궁금 해서요. 각 버튼은 특정 EditText에 바운드되어 있으므로 ButtonsTagEditText으로 설정 했습니까? Tag은 UI 요소를 포함하는 임의의 Object 일 수 있습니다. 이는 런타임에 채워지는 목록과 같은 동적 UI 요소에 특히 유용합니다.

귀하의 Adapter에서 처리되므로 중복 된 부모 등에 대해 걱정할 필요가 없습니다. 또한 onClick()에서 컨트롤을 "찾는"것에 대해 걱정할 필요가 없도록 할 수 있습니다 (태그입니다). 나는 당신의 프로젝트가 필요로하는 것이 정확히 무엇인지는 모르겠지만, 다른 작업을 수행하기 위해서는 Buttons이 필요하지 않다면 잠재적으로 실행 가능한 솔루션처럼 보일 것입니다. 주의 의

참고 그냥이 완료되면 당신은 EditText에 태그 '참조를 삭제 있는지 확인하십시오. 그렇지 않으면 메모리가 누출 될 위험이 있습니다.

FuzzicalLogic

+0

안녕하세요, 팁 주셔서 감사합니다! 그것은 코드를 더 좋게 만들었지 만 복제 된 레퍼런스는 그대로 유지됩니다./ EditText를 버튼의 태그로 넣고 id를 editText 태그로 지정합니다 (이 id는 각 listView 요소에 저장해야 함). 그리고 내 활동을 시작하고 일부 편집 텍스트 값 (일반적으로 첫 번째 ET)을 변경하면 다른 하나는 값도 변경됩니다 (보통 첫 번째 편집시 현재보기 외부에있는 ET 요소). 그래서 내 ID를 각 EditText의 태그로 넣고 편집 할 때 토스트에 표시합니다. 놀랍게도 이드는 다르다! 그래서 어딘가에 문제가 내 어댑터에 있다고 생각합니다. – IPValverde

+0

소리가 좋아. 최소한 그것은 어디에서 시작해야하는지에 대한 아이디어를 제공합니다. 어댑터를 정말 빨리 살펴볼 것입니다. –

+0

이스라엘, 업데이트 된 코드를 게시 하시겠습니까? 특히 getView() 및 onClick()? –