如何从 Android 中 CustomAdapter 的 getView 中的 onClickListener 更新视图
How to update view from an onClickListener inside getView of a CustomAdapter in Android
我想达到什么目的?
- 在下面的 SS 中,当用户触摸 'vote' 按钮时,这些垂直进度条(自定义)将根据从服务器检索到的特定行的投票百分比进行设置。
障碍是什么?
- 我在 CustomAdapter 的 getView 中有 onClickListener,当我操作 ProgressBar 实例(在 ViewHolder Class 中)时,假设我只想在列表视图的一行上看到更新的 ProgressBar已触发该操作,但是,我每向下滚动 3 行就会看到一次。
- 示例:我点击了第一行,所以第一行更新了它的进度条,但是第 4、7、10...行也会更新,即使我不触摸 'vote button'。
我的猜测
- 我认为这个问题与回收视图有关,在这种情况下奇怪的数字是 3,但是当我缩小行时它变成“4”,所以这是我唯一的线索。
SS 和代码
屏幕截图:bit.ly/sofscreenshot
代码:
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate(layout, null);
holder = new ViewHolder();
//some more initialization
holder.pb1 = (ProgressBar) convertView.findViewById(R.id.leftProgress);
holder.pb2 = (ProgressBar) convertView.findViewById(R.id.rightProgress);
holder.leftVoteButton = (Button) convertView.findViewById(R.id.leftButton);
holder.rightVoteButton = (Button) convertView.findViewById(R.id.rightButton);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.leftVoteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.pb1.setVisibility(View.VISIBLE);
holder.pb2.setVisibility(View.VISIBLE);
/Some codes...
holder.pb1.setProgress(50);
holder.pb2.setProgress(50);
}
});
}
private class ViewHolder {
//some more objects
ProgressBar pb1;
ProgressBar pb2;
Button leftVoteButton;
Button rightVoteButton;
}
感谢所有的回答和评论,祝你有美好的一天,谢谢。
你做错了。
问题是您需要在某处拥有一个模型,并更改其状态。然后更新有关模型状态的视图。
例如,假设这是一个 "Whosebug" 应用,并且您有一个答案列表。用户赞成第二个答案。这意味着列表的第二个元素被赞成。
现在怎么办?
当适配器浏览您的对象列表时,它将 "fire" 该位置的 getView 方法。然后你必须根据你的模型更新那个位置。因此,如果位置为 1,则适配器试图显示第二个答案,您必须将按钮设置为 "upvoted"。否则你必须将它设置为 "normal".
private List<Answer> answers;
public View getView(int position, View convertView, ViewGroup parent) {
// here get your view (or initialize it)
// get the matching answer
Answer answer = answers.get(position);
if(answer.isUpvoted()) {
holder.pb1.setVisibility(View.VISIBLE);
holder.pb2.setVisibility(View.VISIBLE);
} else {
holder.pb1.setVisibility(View.INVISIBLE);
holder.pb2.setVisibility(View.INVISIBLE);
}
holder.leftVoteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.pb1.setVisibility(View.VISIBLE);
holder.pb2.setVisibility(View.VISIBLE);
// not sure on how to get this answer here
// you probably have to go "upper" and manage the click from the ListView
answer.setUpvoted(true);
}
});
}
我想达到什么目的?
- 在下面的 SS 中,当用户触摸 'vote' 按钮时,这些垂直进度条(自定义)将根据从服务器检索到的特定行的投票百分比进行设置。
障碍是什么?
- 我在 CustomAdapter 的 getView 中有 onClickListener,当我操作 ProgressBar 实例(在 ViewHolder Class 中)时,假设我只想在列表视图的一行上看到更新的 ProgressBar已触发该操作,但是,我每向下滚动 3 行就会看到一次。
- 示例:我点击了第一行,所以第一行更新了它的进度条,但是第 4、7、10...行也会更新,即使我不触摸 'vote button'。
我的猜测
- 我认为这个问题与回收视图有关,在这种情况下奇怪的数字是 3,但是当我缩小行时它变成“4”,所以这是我唯一的线索。
SS 和代码
屏幕截图:bit.ly/sofscreenshot
代码:
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate(layout, null);
holder = new ViewHolder();
//some more initialization
holder.pb1 = (ProgressBar) convertView.findViewById(R.id.leftProgress);
holder.pb2 = (ProgressBar) convertView.findViewById(R.id.rightProgress);
holder.leftVoteButton = (Button) convertView.findViewById(R.id.leftButton);
holder.rightVoteButton = (Button) convertView.findViewById(R.id.rightButton);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.leftVoteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.pb1.setVisibility(View.VISIBLE);
holder.pb2.setVisibility(View.VISIBLE);
/Some codes...
holder.pb1.setProgress(50);
holder.pb2.setProgress(50);
}
});
}
private class ViewHolder {
//some more objects
ProgressBar pb1;
ProgressBar pb2;
Button leftVoteButton;
Button rightVoteButton;
}
感谢所有的回答和评论,祝你有美好的一天,谢谢。
你做错了。
问题是您需要在某处拥有一个模型,并更改其状态。然后更新有关模型状态的视图。
例如,假设这是一个 "Whosebug" 应用,并且您有一个答案列表。用户赞成第二个答案。这意味着列表的第二个元素被赞成。
现在怎么办?
当适配器浏览您的对象列表时,它将 "fire" 该位置的 getView 方法。然后你必须根据你的模型更新那个位置。因此,如果位置为 1,则适配器试图显示第二个答案,您必须将按钮设置为 "upvoted"。否则你必须将它设置为 "normal".
private List<Answer> answers;
public View getView(int position, View convertView, ViewGroup parent) {
// here get your view (or initialize it)
// get the matching answer
Answer answer = answers.get(position);
if(answer.isUpvoted()) {
holder.pb1.setVisibility(View.VISIBLE);
holder.pb2.setVisibility(View.VISIBLE);
} else {
holder.pb1.setVisibility(View.INVISIBLE);
holder.pb2.setVisibility(View.INVISIBLE);
}
holder.leftVoteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.pb1.setVisibility(View.VISIBLE);
holder.pb2.setVisibility(View.VISIBLE);
// not sure on how to get this answer here
// you probably have to go "upper" and manage the click from the ListView
answer.setUpvoted(true);
}
});
}