【问题标题】:How to update view from an onClickListener inside getView of a CustomAdapter in Android如何从 Android 中 CustomAdapter 的 getView 中的 onClickListener 更新视图
【发布时间】:2016-01-19 22:05:07
【问题描述】:

我想实现什么?

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

障碍是什么?

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

我的猜测

  • 我认为这个问题与回收视图有关,在这种情况下奇怪的数字是 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; 

}

感谢所有答案和 cmets,祝你有美好的一天,谢谢。

【问题讨论】:

    标签: android listview onclicklistener custom-adapter


    【解决方案1】:

    你做错了。

    问题是您需要在某处拥有一个模型,并更改其状态。然后根据模型状态更新视图。

    例如,假设这是一个“StackOverflow”应用,并且您有一个答案列表。用户支持第二个答案。这意味着 List 的第二个元素被投票赞成。

    现在呢?

    当适配器遍历您的对象列表时,它将“触发”该位置的 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);
            }
        });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多