2013-09-13 1 views
1

В моем приложении я использую настраиваемый просмотр списка с текстовым видом, редактированием текста и кнопками. Когда я нажимаю кнопку в позиции «0» Th и меняю значения текстового вида в позиции «0» Th. Когда я прокручиваю вниз list-view значения в «0» вид текстовой позиции Th изменился на то, что когда-либо было в исходном состоянии.Значения текста изменяются в настраиваемом списке при прокрутке списка в android?

Мой базовый адаптер класса

public class sample extends BaseAdapter{ 

public ArrayList<HashMap<String, String>> list; 
Activity activity; 

public sample(Activity activity,ArrayList<HashMap<String, String>> list) { 
    super(); 
    this.activity = activity; 
    this.list = list; 
} 

public int getCount() { 
    // TODO Auto-generated method stub 
    return list.size(); 
} 

public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return list.get(position); 
} 

public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

class ViewHolder { 

    Button order; 
    TextView item_name, order_qty; 
    EditText et_quantity; 

} 

public View getView(final int position, View convertView,final ViewGroup parent) { 
    // TODO Auto-generated method stub 



    final ViewHolder holder; 
    LayoutInflater inflater = activity.getLayoutInflater(); 

    if (convertView == null) { 

     convertView = inflater.inflate(R.layout.order_custom, null); 

     holder = new ViewHolder(); 

     holder.order = (Button) convertView.findViewById(R.id.order); 
     holder.item_name = (TextView) convertView.findViewById(R.id.item_name); 
     holder.order_qty = (TextView) convertView.findViewById(R.id.order_count); 

     convertView.setTag(holder); 

    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
try{ 
    HashMap<String, String> map = list.get(position); 

    holder.item_name.setText(map.get("name")); 

    //Log.v("Available or not", ""+map.get("available")); 


}catch(Exception e){ 
    e.printStackTrace(); 
} 


holder.order.setOnClickListener(new View.OnClickListener() { 

    public void onClick(View arg0) { 
     // TODO Auto-generated method stub 

     //here am click the button to change order count text value 
     int qty = Integer.valueOf(""+holder.order_qty.getText().toString()); 

     qty++; 

     holder.order_qty.setText(""+String.valueOf(qty)); 
} 
}); 


return convertView; 
} 

} 

я не знаю, почему текстовые значения изменились в исходное состояние, когда прокрутки вниз настроенный список view.Can любой знает, пожалуйста, помогите мне решить эту проблему

ответ

5

Проблема заключается в том, что вы не используете другой держатель для каждой строки и что при повторном использовании элементов списка элементов ваши держатели перетасовываются.

Это просто добавление поля final int position к вашему держателю, где можно сохранить параметр позиции getView; отладки, вы увидите, что произойдет.

Итак, вы не можете использовать держатели для хранения количества значений

Кроме того, вы не используете переменную list для хранения значений количества. Этот код работает для меня:

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

    final ViewHolder holder; 
    LayoutInflater inflater = activity.getLayoutInflater(); 

    if (convertView == null) { 

     convertView = inflater.inflate(R.layout.order_custom, null); 

     holder = new ViewHolder(); 

     holder.order = (Button) convertView.findViewById(R.id.order); 
     holder.item_name = (TextView) convertView.findViewById(R.id.item_name); 
     holder.order_qty = (TextView) convertView.findViewById(R.id.order_count); 

     convertView.setTag(holder); 

    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    try{ 
     HashMap<String, String> map = list.get(position); 

     holder.item_name.setText(map.get("name")); 
     holder.order_qty.setText(map.get("quantity")); 

     //Log.v("Available or not", ""+map.get("available")); 


    }catch(Exception e){ 
     e.printStackTrace(); 
    } 


    holder.order.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 

      //here am click the button to change order count text value 
      int qty = Integer.valueOf(list.get(position).get("quantity")); 

      qty++; 

      holder.order_qty.setText(""+String.valueOf(qty)); 
      list.get(position).put("quantity", qty+""); 
     } 
    }); 


    return convertView; 
} 
+0

после того, как я поставил вопрос, я нашел решение. Как и вы ..anyway Спасибо paolo. – Yugesh

+0

можете ли вы отправить/прокомментировать решение на ваш вопрос. Спасибо! – PLOW

0

Я столкнулся с той же проблемой. Причина проблемы описана в предыдущем ответе, однако предлагаемый блок кода не помог решить проблему в моем случае.

Я добавил 350 записей в свой список, и один объект адаптера имеет четыре EditTexts.

Неожиданное поведение происходило с прослушивателем TextWatcher.

Я использовал фокус проверки слушателя, чтобы решить эту проблему:

holder.priceView.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
       @Override 
       public void onFocusChange(View v, boolean hasFocus) { 
        if (!hasFocus) 
        { 
         // saving data on focus loss. 
         p.setPrice(holder.priceView.getText().toString()); 
        } 
       } 
      }); 

// holder is my ViewHolder object , priceView is a editText in holder object, p is a reference of my data model. 

Это работает, но обновления в режиме реального времени может быть не как ожидалось - как текстовые наблюдатели.

И есть худший случай, когда последнее действие (без потери фокуса, последнее отредактированное значение не запускается и не обновляется).

Смежные вопросы