Android 如何在使用BaseAdapter生成的listview中仅对一行进行更改?
我已经使用BaseAdapter生成了一个ListView。我的列表视图中有2个按钮。我想在单击行中的按钮2时使我的按钮1不可见。然后,当单击另一行的按钮2时,我希望使当前行中的按钮1不可见,使以前不可见的按钮1可见,即一次只能使一行的按钮1不可见。我已经完成了以下操作,但我不知道如何在单击的行中设置按钮1的可见性。请一步一步地引导我。我的适配器代码如下所示:Android 如何在使用BaseAdapter生成的listview中仅对一行进行更改?,android,listview,baseadapter,getview,Android,Listview,Baseadapter,Getview,我已经使用BaseAdapter生成了一个ListView。我的列表视图中有2个按钮。我想在单击行中的按钮2时使我的按钮1不可见。然后,当单击另一行的按钮2时,我希望使当前行中的按钮1不可见,使以前不可见的按钮1可见,即一次只能使一行的按钮1不可见。我已经完成了以下操作,但我不知道如何在单击的行中设置按钮1的可见性。请一步一步地引导我。我的适配器代码如下所示: private class ListAdapter extends BaseAdapter { LayoutInflat
private class ListAdapter extends BaseAdapter {
LayoutInflater inflater;
ViewHolder viewHolder;
public ListAdapter(Context context) {
// TODO Auto-generated constructor stub
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return _productlist.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return _productlist.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
private final boolean[] mHighlightedPositions = new boolean[getCount()];
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if (convertView == null) {
convertView = inflater.inflate(R.layout.listview_row, null);
viewHolder = new ViewHolder();
viewHolder.Button1 = (Button) convertView
.findViewById(R.id.btn_update);
convertView.setTag(viewHolder);
viewHolder.Button2 = (Button) convertView
.findViewById(R.id.btn_update2);
convertView.setTag(viewHolder);
}
else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.Button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(mHighlightedPositions[position]) {
viewHolder.Button1.setVisibility(convertView.INVISIBLE);
}
}
});
return convertView;
}
您需要保留上一个隐藏按钮视图,以便在单击另一个项目按钮时使其可见 首先,在BaseAdapter中声明一个静态变量来保存隐藏按钮 接下来,将click listener添加到Button2,隐藏Button1并使最后一个隐藏的按钮可见 这将确保在单击按钮2时,属于已单击行的按钮1将被隐藏 通过此更改,您将注意到,由于ListView循环,很少有其他行按钮也会被隐藏。要解决此问题,您需要通知ListView所有我的列表项视图都不同。当您有数百个项目时,这将对ListView性能产生影响,但无法避免 最后,在BaseAdapter中重写getItemViewType和getViewTypeCount,并让ListView知道所有的items视图类型都不同
@Override
public int getItemViewType(int position){
// return a unique number
return position;
}
@Override
public int getViewTypeCount() {
return getCount();
}
final Button hideButton = placeHolder.button1;
placeHolder.button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// if the last hidden button is valid make it to visible
if(lastHiddenButton != null){
lastHiddenButton.setVisibility(View.VISIBLE);
lastHiddenButton = null;
}
// hide button1
hideButton.setVisibility(View.GONE);
lastHiddenButton = hideButton;
}
});
@Override
public int getItemViewType(int position){
// return a unique number
return position;
}
@Override
public int getViewTypeCount() {
return getCount();
}