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

How to update view from an onClickListener inside getView of a CustomAdapter in Android

我想达到什么目的?

障碍是什么?

我的猜测

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