Android 如何制作按钮单击事件

Android 如何制作按钮单击事件,android,Android,我的行包含一个按钮,该按钮在适配器的 当我点击按钮时,它会将按钮文本设置为“是”,然后再次点击,然后将其更改为“否”“正确地说,我的问题是当我在列表中滚动时,它也会为不同的行设置它。我想他们的观点在某个地方是有问题的。当我滚动列表,然后更改文本按钮需要双击再次更改按钮文本。但我希望它在一次点击。 我该怎么办 这是我的密码: public class ListAdapter extends ArrayAdapter<Model> { customButtonListener c

我的行包含一个按钮,该按钮在适配器的

当我点击按钮时,它会将按钮文本设置为“是”,然后再次点击,然后将其更改为“否”“正确地说,我的问题是当我在列表中滚动时,它也会为不同的行设置它。我想他们的观点在某个地方是有问题的。当我滚动列表,然后更改文本按钮需要双击再次更改按钮文本。但我希望它在一次点击。 我该怎么办

这是我的密码:

public class ListAdapter extends ArrayAdapter<Model> {
    customButtonListener customListner;

    public interface customButtonListener {
        public void onButtonClickListner(int position, Model model);
    }

    public void setCustomButtonListner(customButtonListener listener) {
        this.customListner = listener;
    }

    private Context context;
    private ArrayList<Model> data = new ArrayList<Model>();

    public ListAdapter(Context context, ArrayList<Model> dataItem) {
        super(context, R.layout.row, dataItem);
        this.data = dataItem;
        this.context = context;
    }


    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder viewHolder;

        if (convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(context);
            convertView = inflater.inflate(R.layout.row, null);
            viewHolder = new ViewHolder();
            viewHolder.text = (TextView) convertView
                    .findViewById(R.id.childTextView);
            viewHolder.text1 = (TextView) convertView
                    .findViewById(R.id.childTextView1);
            viewHolder.button = (Button) convertView
                    .findViewById(R.id.childButton);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        final Model model = getItem(position);
        viewHolder.text.setText(model.getNames());
        viewHolder.button.setTag(1);
        viewHolder.button.setText(model.getYes());
        viewHolder.button.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {

                int status = (Integer) v.getTag();
                if (status == 1) {
                    model.setYes("Yes");

                    viewHolder.button.setText("Yes");
                    v.setTag(0);
                } else {
                    model.setYes("No");

                    viewHolder.button.setText("No");
                    v.setTag(1);
                }
            }
        });


        return convertView;
    }

    public class ViewHolder {
        ViewHolder viewHolder;
        TextView text, text1;
        Button button;
    }

}
公共类ListAdapter扩展了ArrayAdapter{
customButtonListener CustomListener;
公共接口customButtonListener{
公共无效onButtonClickListner(内部位置,模型);
}
public void setCustomButtonListner(customButtonListener侦听器){
this.customListner=侦听器;
}
私人语境;
private ArrayList data=new ArrayList();
公共ListAdapter(上下文上下文,ArrayList数据项){
super(上下文、R.layout.row、数据项);
this.data=数据项;
this.context=上下文;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
最终持票人;
if(convertView==null){
LayoutFlater充气机=LayoutFlater.from(上下文);
convertView=充气机充气(R.layout.row,空);
viewHolder=新的viewHolder();
viewHolder.text=(TextView)convertView
.findViewById(R.id.childTextView);
viewHolder.text1=(TextView)convertView
.findViewById(R.id.childTextView1);
viewHolder.button=(按钮)convertView
.findViewById(R.id.childButton);
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
最终模型=getItem(位置);
viewHolder.text.setText(model.getNames());
viewHolder.button.setTag(1);
viewHolder.button.setText(model.getYes());
viewHolder.button.setOnClickListener(新的OnClickListener(){
公共void onClick(视图v){
int status=(整数)v.getTag();
如果(状态==1){
型号:setYes(“是”);
viewHolder.button.setText(“是”);
v、 setTag(0);
}否则{
型号:setYes(“否”);
viewHolder.button.setText(“否”);
v、 setTag(1);
}
}
});
返回视图;
}
公共类视图持有者{
持票人持票人;
TextView文本,text1;
按钮;
}
}

您需要删除viewHolder.button.setTag(1);来自代码。此代码实际上将以前设置为0的标记更改为1。因此需要单击2次将其再次更改为1,然后更改将反映在ui中。

这是listview中的一个常见问题。
getViewTypeCount()
getItemViewType(int位置)
方法可以解决此问题

在适配器中添加以下两种方法:

@Override
public int getViewTypeCount() {
    // TODO Auto-generated method stub
    return 2;//The number of conditions that may occur in listview
}


@Override
public int getItemViewType(int position) {
    // TODO Auto-generated method stub

     if (status == 1) {
           return 1;
        } else {
           return 0;
        }

}
然后在getView()方法中:

要了解更多关于这两种方法的信息,您可以查看和

和教程:和


如果您正确实现这两种方法,则不会再次出现此问题。

当我将其删除时,按钮文本不会更改为是否否否交替yyy我希望当我第一次单击是然后第二次单击否时向下滚动并再次向上滚动,然后当我单击是时,需要双击滚动然后获取视图重置为起始状态
 int type=getItemViewType(position);


                if(type==1)
                {
                     model.setYes("Yes");

                viewHolder.button.setText("Yes");
                v.setTag(0);
                }else{
                     model.setYes("No");
                viewHolder.button.setText("No");
                v.setTag(1);
                }