我的自定义ListView
带有button
,因此当我点击button
时,它会消失并消失,但当我向下滚动并返回{{1}时再次出现,不同的button
正在消失。如何使特定的button
在点击时消失....我正在使用此代码
button
答案 0 :(得分:2)
在ListView中,当一个项目离开屏幕时,为了提高效率,ListView会破坏该项目,当滚动回该项目时,它会通过调用适配器的getView()方法重新创建它,因此您必须保留一个具有布尔值的数组的状态对于可见按钮,默认情况下为true,在getView()中,您只需通过从布尔数组中获取状态的布尔值来检查,如果为true,则项目可见,否则其他项目不可见。所以当你消失一个项目时,你必须设置项目的状态也是假的。 我假设这是你的getView()中的代码,你已经定义了你的布尔数组,其长度与ListView的项目相同,值为true,名称为“yourButtonStatusBooleanArray”,然后进行以下修改将适合你。
holder.checkbox = (Button) view.findViewById(R.id.checkBox1);
if(!yourButtonStatusBooleanArray[position])
{
holder.checkbox.setVisibility(View.INVISIBLE);
}
holder.checkbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.checkbox.setVisibility(View.INVISIBLE);
yourButtonStatusBooleanArray[position]=false;
答案 1 :(得分:1)
尝试在按钮声明后添加holder.checkbox.setVisibility(View.VISIBLE);
答案 2 :(得分:1)
这是因为视图回收而发生的。您需要做的是维护一组假布尔值,每次单击一个按钮切换相应的布尔值。然后在你的getview中检查相应的布尔数组位置并设置按钮的状态。
了解更多细节请点击此链接
check box in listview not working properly
以上示例用于复选框编辑代码。
答案 3 :(得分:1)
问题是行的视图被重用,因此在滚动之后,行视图可能会显示具有不同行状态的按钮。您可以通过在视图初始化时显式设置按钮的可见性来解决此问题。所以你必须记住某个地方的行的状态,例如在数据对象中或跟踪已选择项目的数组中。
holder.checkbox.setVisibility(dataObject.getVisibilityState());
编辑回答评论,此处显示有代码块
你必须自己实现方法,代码只是一个如何使用自定义方法的例子。所以你可以在你的项目Class:
中做这样的事情 public class Item {
private int visibility;
... other attributes of your item
public int getVisibilityState(){
return visibility;
}
public void setVisible(){
visibility = View.VISIBLE;
}
public void setInvisible(){
visibility = View.INVISIBLE;
}
}
答案 4 :(得分:1)
您需要在ListAdapter中实现此方法,每当您的视图行从屏幕外移动到屏幕上时,由于用户滚动列表,就会调用此方法。传递给getView方法的View实际上可能用于显示完全不同的行的数据。这是因为对象被回收 - 如果您有1,000行的数据,但屏幕上只有8个视图,系统会为您的行创建8个View对象,而不是1,000。
如果您的类实现了ListAdapter,您可以按如下方式覆盖getView方法:
public class MyClass implements ListAdapter {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
//Create a view for this row if none exists yet
if (rowView == null) {
LayoutInflater inflater = (LayoutInflater) _context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
rowView = inflater.inflate(R.layout.YOUR_ROW_LAYOUT, parent, false);
//make the button go away if it should not be visible
if (buttonShouldBeNotVisible(convertView)) { //Your code should determine this
convertView.checkbox.setVisibility(View.INVISIBLE);
//Use View.GONE to make it take up no space
}
return convertView
} }
答案 5 :(得分:1)
视图在列表视图中回收。您必须在某种数据结构中保存按钮的状态,并将其设置在适配器getView(int, View, ViewGroup)
中。
private HashMap<Integer, Boolean> mButtonMap = new HashMap<Integer, Boolean>();
[...]
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View retVal;
// Do all your stuff with each row
if (!mButtonMap.containsKey(new Integer(position))) {
button.setVisibility(View.VISIBLE);
}
else {
button.setVisibility(View.INVISIBLE);
}
button.setTag(""+position);
return retVal;
}
//In your onClickListener
onClick(View v) {
[...]
int position = Integer.parseInt((String) v.getTag());
mButtonMap.put(position, true);
button.setVisibility(View.INVISIBLE);
}
答案 6 :(得分:1)
您可以这样做:
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
ViewHolder holder;
if (convertView == null) {
vi = inflater.inflate(R.layout.grid_adapter, null);
holder = new ViewHolder();
holder.checkbox = (Button) view.findViewById(R.id.checkBox1);
holder.checkbox.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (arg0.getTag().equals("0")) {
arg0.setVisibility(View.INVISIBLE);
arg0.setTag("1");
}
notifyDataSetChanged();
}
});
vi.setTag(holder);
} else
holder = (ViewHolder)vi.getTag();
try {
if (holder.checkbox.getTag().equals("1")) {
holder.checkbox.setVisibility(View.INVISIBLE);
} else {
holder.checkbox.setVisibility(View.VISIBLE);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return vi;
}