2015-09-08 3 views
-1

У меня есть listview элемент с label и два buttons. Я попытался изменить ярлык при нажатии кнопки. Но он меняет текст на другой элемент списка. Не ярлык с кнопкой. Я сделал это с помощью адаптера пользовательского списка. Я попробовал это, как показано ниже:изменить текст на этикетке при нажатии кнопки внутри элемента списка.

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    final MenuItem listItem = objects.get(position); 

    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) this.context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.menu_list_item, null); 

     btnPlus = (ButtonRectangle) convertView.findViewById(R.id.buttonPlus); 
     btnPlus.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       int i = 0; 
       cartQtyTextView.setText("" + ++i); 

      } 
     }); 
    } 
} 

Как я могу это исправить?

+0

Вы можете заменить ListView с видом ресайклера? – rKrishna

+0

Создаете ли вы держатель? Для TextView и кнопки? – Nic

+0

@RKNP, в чем проблема с ListView? Не может быть сделано с ListView? –

ответ

1

Возможно, вы захотите создать держатель. Я не включил ваш код пункта меню из-за того, что не видел, чтобы вы его использовали.

public class Holder { 
    ButtonRectangle buttonPlus; 
    TextView cartQtyTextView; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // Get Holder 
    final Holder holder = new Holder(); 

    // Change Layout 
    LayoutInflater inflater = (LayoutInflater) this.context 
           .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View view = inflater.inflate(R.layout.menu_list_item, null); 

    // Find Control 
    holder.buttonPlus = (ButtonRectangle)view.findViewById(R.id.buttonPlus); 
    holder.cartQtyTextView = (TextView)view.findViewById(R.id.cartQtyTextView); 

    // Check & Set 
    if (holder.buttonPlus != null) { 
     holder.buttonPlus.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       int i = 0; 
       if (holder.cartQtyTextView != null) { 
        holder.cartQtyTextView.setText("" + ++i); 
       } 
      } 
     }); 
    } 

    return view; 
} 
+0

спасибо. это работает .. Что здесь происходит? (с держателем) – codebot

+0

Возможно, вы захотите прочитать это для владельца http://developer.android.com/intl/ja/training/improving-layouts/smooth-scrolling.html#ViewHolder. – Nic

+0

Но с этим некоторые элементы списка повторяются. – codebot

0

Это потому, что вы настраиваете слушателя внутри if(convertView==null).

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

Вам необходимо установить onClickListener за пределами if. И это будет лучше, если вы используете holder для лучших спектаклей

0
public class ExampleAdapter extends ArrayAdapter<MenuItem> { 

private Activity activity; 
private int resource; 
private List<MenuItem> objects; 

public ExampleAdapter(Activity activity, int resource, List<MenuItem> objects) { 
    super(activity, resource, objects); 

    this.activity = activity; 
    this.resource = resource; 
    this.objects= objects; 
} 

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

    MenuItem listItem = objects.get(position); 
    ViewHolder holder = null; 

    if (convertView == null) { 

     holder = new ViewHolder(); 
     LayoutInflater li = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = li.inflate(resource, parent, false); 

     holder.labelTextView= (TextView) convertView.findViewById(R.id.labelTextView); 
     holder.btnPlus= (ButtonRectangle) convertView.findViewById(R.id.buttonPlus); 

     convertView.setTag(holder); 

    } else { 

     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.btnPlus.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      int i = 0; 
      holder.labelTextView.setText("" + ++i); 

     } 
    }); 

    return convertView; 
} 

static class ViewHolder { 

    TextView labelTextView; 
    ButtonRectangle btnPlus; 

} 

}

+0

это копия ответа «Николаса». Нет нового, чтобы узнать .. спасибо вам. – codebot

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