如何在自定义ListView中设置按钮的可见性?

时间:2013-04-30 08:08:39

标签: android listview button android-listview visibility

我的自定义ListView带有button,因此当我点击button时,它会消失并消失,但当我向下滚动并返回{{1}时再次出现,不同的button正在消失。如何使特定的button在点击时消失....我正在使用此代码

button

7 个答案:

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