如何制作Button单击事件

时间:2015-09-12 05:49:22

标签: android

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

中设置了自己的点击侦听器

当我点击一个按钮时,它将按钮文本设置为“是”并再次点击而不是正确地将其更改为“否”,我的问题是当我滚动列表时它也为不同的行设置它。我假设他们的一个问题回收的问题。当我滚动列表然后更改文本按钮需要双击再次更改按钮文本。但我想单击一下。 我该怎么办?

这是我的代码:

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

}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这是listview中的常见问题。您可以使用getViewTypeCount()getItemViewType(int position)方法克服它。

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

@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()方法中:

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

要了解有关这两种方法的更多信息,您可以看到this以及this

教程:herehere

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