2

我目前正在开发一个需要ListView自定义 NumberPickers 的活动。我按照这里的建议创建了数字选择器。

我面临的问题非常令人沮丧;当我单击数字选择器的 + 按钮时,文本视图一直显示 0。我已经尝试了所有这些建议,但没有任何改变。

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

    View vi = convertView;

    //ViewHolder holder = new ViewHolder();

    if(vi == null)
    {
        holder = new ViewHolder();

        vi = inflater.inflate(R.layout.materialdialogcontent, null);

        //Initialize Buttons and TextViews.

        holder.num.setText("0");

        holder.add.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v) 
            {
                counter++;
                holder.num.setText("" + counter);
            }
        });

        holder.sub.setOnClickListener(new View.OnClickListener()
        {   
            @Override
            public void onClick(View v) 
            {
                counter--;
                holder.num.setText("" + counter);
            }
        });


        //holder.pk = (NumberPicker)vi.findViewById(R.id.npMaterialAmount);

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

    holder.txt.setText(data.get(position).getName());
    //holder.pk.setMaxValue(20);
    //holder.pk.setMinValue(0);

    return vi;
}

public static class ViewHolder
{
    TextView txt;
    Button add;
    Button sub;
    TextView num;
    //NumberPicker pk;
}

上面的代码在我的ListView适配器中找到。

以下是我已经尝试过的:

当我调试上面的代码时,计数器增加,并且调试器变量显示TextView's 的文本实际上被设置为计数器中存在的数字,但是显示的数字仍然是 0。

我也尝试将 an 设置OnItemClickListener()ListView,但仍然没有任何反应。然后,我从 ListView 适配器类中删除了Button单击侦听器,并将它们放在 ListView 的onItemClickListener(). 但是,在调试时,Button调试器会跳过单击侦听器。

你有什么其他的建议?

我将不胜感激所有可能的帮助。

更新:

holder.add.setTag(position);
    holder.add.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v) 
        {
            int position = (Integer)v.getTag();
            int temp = numPickerValues.get(position);
            temp += 1;
            numPickerValues.set(position, temp);
            notifyDataSetChanged();
        }
    });
    holder.num.setText(String.valueOf(numPickerValues.get(position)));
    return convertView;
4

4 回答 4

2

现在您可能正在更新其他视图,计数器变量也不能使用。处理这些行号选择器的正确方法是将它们的当前值保存在某些数据结构中,并从该列表中设置/更新当前值:

View vi = convertView;
ViewHolder holder;
if(vi == null) {
    holder = new ViewHolder();
    vi = inflater.inflate(R.layout.materialdialogcontent, null);
    //Initialize Buttons and TextViews.
    vi.setTag(holder);
} else {
    holder = (ViewHolder)vi.getTag();
}
holder.txt.setText(data.get(position).getName());
holder.add.setTag(position); // so we have the proper position in the onClick method
holder.add.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
       // there's no need for counter
      int position = v.getTag();
      // numberpickervalues is the array/list of int values representing the values from all the row
      // update the proper value  
      int temp = numPickerValues.get(position);
      temp += 1; // incremment the value
      numPickerValues.set(position, temp);
      notifyDataSetChanged(); // let the list know about this change
}
});
holder.num.setText(String.valueOf(numberPickerValues.get(position)));
于 2013-08-12T08:01:33.580 回答
0

正如我几天前已经建议的那样: ViewHolder 需要是一个静态类。

private static class ViewHolder {
    TextView txt;
    Button add;
    Button sub;
    TextView num;
    //NumberPicker pk;
}

使用静态内部类的一个好处是可以从静态方法访问内部类,而无需外部类的实例。

我也看不到你在递减时为按钮设置文本的原因:

 holder.sub.setText("" + counter);

不应该吗?

 holder.num.setText("" + counter);

我想当你用你的按钮增加时,什么都不会发生,但是当你滚动到 ListView 中的另一个位置然后回到你增加的位置时,将显示增加的值。这是因为 ListView 在滚动时刷新。只需调用

notifyDataSetChanged()

刷新 ListViews 视图。

于 2013-08-12T06:17:26.607 回答
0

你需要调用 notifyDataSetChanged()。

这来自Android API

公共无效 notifyDataSetChanged ()

通知附加的观察者基础数据已更改,并且任何反映数据集的视图都应自行刷新。

于 2013-08-12T06:19:05.317 回答
0

一旦你增加了我想你需要刷新列表视图。为此,请点击以下链接:

更新列表视图

于 2013-08-12T06:19:49.680 回答