0

我有一个ListView带有 a的自定义button,所以当我单击 abutton它应该消失并且它正在消失但是当我向下滚动并返回时,button它再次出现并且不同button的消失了。我怎样才能使特定button在单击时消失....我正在使用此代码

holder.checkbox = (Button) view.findViewById(R.id.checkBox1);

holder.checkbox.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
    holder.checkbox.setVisibility(View.INVISIBLE);
4

7 回答 7

2

在 ListView 中,当一个项目离开屏幕时,为了提高效率,ListView 会破坏该项目,当滚动回该项目时,它会通过调用适配器的 getView() 方法重新创建它,因此您必须保留一个数组,该数组具有按钮状态的布尔值对于可见,默认情况下为真,在 getView() 中,您只需通过从布尔数组中获取状态的布尔值进行检查,如果为真,则项目可见,否则项目不可见。因此,当您消失一个项目时,您必须将项目的状态也设置为 false。我假设这是您的 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;
于 2013-04-30T08:17:22.080 回答
1

尝试holder.checkbox.setVisibility(View.VISIBLE);在按钮声明后添加

于 2013-04-30T08:10:51.427 回答
1

这是由于视图回收而发生的。您需要做的是维护一组说布尔值,并且每次单击按钮时都会切换相应的布尔值。然后在您的 getview 中检查相应的布尔数组位置并设置按钮的状态。

有关更多详细信息,请参阅此链接

列表视图中的复选框无法正常工作

上面的示例用于复选框编辑您的代码。

于 2013-04-30T08:18:40.393 回答
1

问题是该行的视图被重用,因此在滚动行视图后可能会显示具有不同行状态的按钮。您可以通过在视图初始化时显式设置按钮的可见性来解决此问题。因此,您必须在某处记住该行的状态,例如在您的数据对象中或在跟踪已选择项目的数组中。

holder.checkbox.setVisibility(dataObject.getVisibilityState());

编辑对评论的回答,此处显示有代码块

您必须自己实现方法,代码只是如何使用自定义方法的示例。所以你可以在你的项目类中做这样的事情:

 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;
 }
 }
于 2013-04-30T08:21:33.237 回答
1

您需要在您的 ListAdapter 中实现此方法,每次您的行视图由于用户滚动列表而从屏幕外变为屏幕时都会调用该方法。传递给您的 getView 方法的 View 实际上可能用于显示完全不同的行的数据。这是因为对象被回收 - 如果您有 1,000 行的数据,但屏幕上只有 8 个视图,系统会为您的行创建 8 个视图对象,而不是 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

} }

于 2013-04-30T08:24:19.530 回答
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);
    }
于 2013-04-30T08:28:58.607 回答
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;
    }
于 2013-04-30T08:41:21.213 回答