如何从Android中CustomAdapter的getView中的onClickListener更新视图

如何从Android中CustomAdapter的getView中的onClickListener更新视图,android,listview,onclicklistener,custom-adapter,Android,Listview,Onclicklistener,Custom Adapter,我想要实现什么? 在下面的SS中,当用户点击“投票”按钮时,这些垂直进度条(自定义)将根据从服务器检索到的特定行的投票百分比进行设置 什么是障碍? 我在CustomAdapter的getView中有onClickListener,当我操作ProgressBar实例(在ViewHolder类中)时,假设我只想在触发该操作的listview的一行上看到更新的ProgressBar,但是,我每向下滚动3行就会看到一行 示例:我单击了第一行,所以第一行更新了它的进度条,但是第四、第七、第十行。。。

我想要实现什么?

  • 在下面的SS中,当用户点击“投票”按钮时,这些垂直进度条(自定义)将根据从服务器检索到的特定行的投票百分比进行设置
什么是障碍?

  • 我在CustomAdapter的getView中有onClickListener,当我操作ProgressBar实例(在ViewHolder类中)时,假设我只想在触发该操作的listview的一行上看到更新的ProgressBar,但是,我每向下滚动3行就会看到一行
  • 示例:我单击了第一行,所以第一行更新了它的进度条,但是第四、第七、第十行。。。即使我不按“投票按钮”,行也会被更新
我的猜测

  • 我认为这个问题与循环使用视图有关,在这种情况下,奇怪的数字是3,但当我将行变小时,它会变为“4”,所以这是我唯一的线索
SS和代码

截图:

代码:

感谢所有的回答和评论,祝您愉快,谢谢。

您做错了

问题是,您需要在某个地方有一个模型,并更改其状态。然后,将更新有关模型状态的视图

例如,假设这是一个“StackOverflow”应用程序,您有一个答案列表。用户投票支持第二个答案。这意味着列表中的第二个元素将被向上投票

现在怎么办

当适配器浏览对象列表时,它将“激发”该位置的getView方法。然后,您必须根据您的模型更新该位置。因此,如果位置为1,适配器将尝试显示第二个答案,您必须将按钮设置为“向上投票”。否则,您必须将其设置为“正常”

私人列表答案;
公共视图getView(int位置、视图转换视图、视图组父视图){
//在这里获取您的视图(或初始化视图)
//得到匹配的答案
答案=答案。获取(位置);
if(answer.isUpvoted()){
holder.pb1.setVisibility(View.VISIBLE);
holder.pb2.setVisibility(View.VISIBLE);
}否则{
holder.pb1.setVisibility(视图.不可见);
holder.pb2.setVisibility(视图.不可见);
}
holder.leftVoteButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
holder.pb1.setVisibility(View.VISIBLE);
holder.pb2.setVisibility(View.VISIBLE);
//不知道如何在这里得到这个答案
//您可能需要转到“上一级”并管理ListView中的单击
回答:正确;
}
});
}
你做错了

问题是,您需要在某个地方有一个模型,并更改其状态。然后,将更新有关模型状态的视图

例如,假设这是一个“StackOverflow”应用程序,您有一个答案列表。用户投票支持第二个答案。这意味着列表中的第二个元素将被向上投票

现在怎么办

当适配器浏览对象列表时,它将“激发”该位置的getView方法。然后,您必须根据您的模型更新该位置。因此,如果位置为1,适配器将尝试显示第二个答案,您必须将按钮设置为“向上投票”。否则,您必须将其设置为“正常”

私人列表答案;
公共视图getView(int位置、视图转换视图、视图组父视图){
//在这里获取您的视图(或初始化视图)
//得到匹配的答案
答案=答案。获取(位置);
if(answer.isUpvoted()){
holder.pb1.setVisibility(View.VISIBLE);
holder.pb2.setVisibility(View.VISIBLE);
}否则{
holder.pb1.setVisibility(视图.不可见);
holder.pb2.setVisibility(视图.不可见);
}
holder.leftVoteButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
holder.pb1.setVisibility(View.VISIBLE);
holder.pb2.setVisibility(View.VISIBLE);
//不知道如何在这里得到这个答案
//您可能需要转到“上一级”并管理ListView中的单击
回答:正确;
}
});
}
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; 

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