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

时间:2016-01-19 22:05:08

标签: android listview onclicklistener custom-adapter

我想达到什么目标?

  • 在下面的SS中,当用户触摸'投票'按钮,这些垂直进度条(自定义)将根据从服务器检索到的特定行的投票百分比进行设置。

障碍是什么?

  • 我在CustomAdapter的getView中有onClickListener,当我操作ProgressBar实例(在ViewHolder类中)时,假设我只想在列表视图的一行触发该操作时看到更新的ProgressBar,但是,我每隔3行就会看到我向下滚动。
  • 示例:我点击了第一行,因此第一行已更新其进度条,但第4行,第7行,第10行也会更新即使我没有触及“投票按钮”也是如此。

我的猜测

  • 我认为这个问题与回收视图有关,在这种情况下奇怪的数字是3但是当我把行缩小时它会变成4',这是我唯一的线索。

SS&码

ScreenShot: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; 

}

所有的答案和评论都表示赞赏,祝你有个美好的一天,谢谢。

1 个答案:

答案 0 :(得分:0)

你做错了。

问题是你需要在某处拥有一个Model,并改变它的状态。然后更新有关模型状态的视图。

例如,假设这是一个“StackOverflow”应用程序,您有一个答案列表。用户提出第二个答案。这意味着List的第二个元素被upvoted。

现在是什么?

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

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