更改按钮上的标签文本在列表视图项

时间:2015-09-08 08:58:20

标签: java android listview android-listview listadapter

我的listview项目包含label和两个buttons。我试图在按钮点击时更改标签。但它改变了另一个listview项目上的文本。不是带按钮的标签。我是使用自定义列表适配器完成的。我尝试过如下,

@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);

            }
        });
    }
}

我该如何解决这个问题?

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

这是因为您在if(convertView==null)内设置了侦听器。

因此只有在创建视图时才设置侦听器,但是当您滚动时,列表视图会重用一个隐藏项,但它会保留第一个分配的侦听器,因为convertView不是null。

您需要在if之外设置onClickListener。如果你使用holder来获得更好的表现,那就更好了

答案 2 :(得分: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;

}

}