我的行包含一个按钮,该按钮在我的适配器的
中设置了自己的点击侦听器当我点击一个按钮时,它将按钮文本设置为“是”并再次点击而不是正确地将其更改为“否”,我的问题是当我滚动列表时它也为不同的行设置它。我假设他们的一个问题回收的问题。当我滚动列表然后更改文本按钮需要双击再次更改按钮文本。但我想单击一下。 我该怎么办?
这是我的代码:
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;
}
}
答案 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。
如果正确实现这两种方法,则不会再出现此问题。