我目前正在处理一项需要ListView
自定义NumberPickers的活动。我根据建议here创建了数字选择器。
我面临的问题非常令人沮丧;当我点击数字选择器的+按钮时,文本视图一直显示0.我已经尝试了所有these suggestions但没有任何改变。
@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
的文本实际上被设置为计数器中的数字,但是显示的数字仍为0。 / p>
我还尝试将OnItemClickListener()
设置为ListView
,但仍然没有任何结果。然后,我从ListView Adapter类中删除了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;
答案 0 :(得分: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)));
答案 1 :(得分: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视图。
答案 2 :(得分:0)
您需要调用notifyDataSetChanged()。
来自Android API
public void notifyDataSetChanged()
通知附加的观察者基础数据已经存在 已更改,任何反映数据集的视图都应自行刷新。
答案 3 :(得分:0)
一旦你增加了我想你需要刷新列表视图。为此,请点击以下链接: