내 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;
어디에서 "et"를 얻을 수 있습니까? –
StackOverflow에 가입 해 주셔서 감사합니다. 귀하의 질문은 잘 정리되어 있으므로 답변을 얻는 방법에 대해 알아 보도록하겠습니다. :) –
@mozarty 나는이 줄로하고있다 : EditText et = (EditText) ll.getChildAt (2); – IPValverde