Android 无法在GridView中启用/禁用可单击文本视图

Android 无法在GridView中启用/禁用可单击文本视图,android,Android,我有一个GridView,可点击的文本视图作为GridView项目,使用适配器(文本视图作为按钮)。当我点击一个文本视图时,我想在GridView中禁用所有的文本视图-从用户不能再点击它们的意义上禁用。我所做的是: private void toggleButtonsState(boolean enabled) { for (int i = 0; i < this.gridview.getChildCount(); i++) {

我有一个GridView,可点击的文本视图作为GridView项目,使用适配器(文本视图作为按钮)。当我点击一个文本视图时,我想在GridView中禁用所有的文本视图-从用户不能再点击它们的意义上禁用。我所做的是:

    private void toggleButtonsState(boolean enabled)
    {
        for (int i = 0; i < this.gridview.getChildCount(); i++)
        {
            this.gridview.getChildAt(i).setEnabled(enabled);            
        }
    }   
}


下面是我的类,它是从
TextViewAdapter
派生的,它本身是从
BaseAdapter
派生的。我的
TextViewAdapter
只定义了一些抽象方法,没有做多少工作。
textViewaPermain
尝试禁用网格中除单击的文本视图之外的所有文本视图。在
OnClick
中,我单击了一个文本视图并想禁用所有其他文本视图,因此我调用了
notifyDataSetChanged
,但是没有调用覆盖
AreAllItemEnabled
isEnabled
(调试器不会在断点处停止)。有什么想法吗?下面是一些代码:

public class TextViewAdapterMain extends TextViewAdapter  {

private ArrayList<Boolean> textViewStates = new ArrayList<Boolean>();

public TextViewAdapterMain(Context c) {
    super(c);


    // TODO Auto-generated constructor stub
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return DbManager.getInstance(mContext).getCategoryCount(true);
}

@Override
protected void setCategoryView(View view, int index) {
    // TODO Auto-generated method stub      

    TextView textView = (TextView)view.findViewById(R.id.timer_textview);       
    textView.setGravity(Gravity.CENTER);
    textView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, 40));

    CheckBox checkbox = (CheckBox)view.findViewById(R.id.timer_checkbox);
    checkbox.setVisibility(View.GONE);
}   

@Override
public void onClick(View arg0) {
    // TODO Auto-generated method stub
    super.onClick(arg0);

    ((TimeManagerActivity)super.mContext).launchChronometer((TextView)arg0);


    this.notifyDataSetChanged();
}

@Override
protected Category getCategory(int index) {
    // TODO Auto-generated method stub
    return DbManager.getInstance(this.mContext).getCategoryByIndex(index, true);
}

@Override
public boolean areAllItemsEnabled() {
    return false;
}

@Override
public boolean isEnabled(int position)
{                           
    if(textViewStates.get(position))
        return true;

    return false;

}

}
public类TextViewAdapterMain扩展了TextViewAdapter{
私有ArrayList textViewState=新ArrayList();
public TextViewAdapterMain(上下文c){
超级(c);
//TODO自动生成的构造函数存根
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回DbManager.getInstance(mContext.getCategoryCount)(true);
}
@凌驾
受保护的void setCategoryView(视图视图,int索引){
//TODO自动生成的方法存根
TextView TextView=(TextView)view.findViewById(R.id.timer\u TextView);
textView.setGravity(Gravity.CENTER);
textView.setLayoutParams(新的LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,40));
复选框=(复选框)view.findViewById(R.id.timer\u复选框);
复选框.setVisibility(View.GONE);
}   
@凌驾
公共void onClick(视图arg0){
//TODO自动生成的方法存根
super.onClick(arg0);
((TimeManagerActivity)super.mContext).启动计时器((TextView)arg0);
this.notifyDataSetChanged();
}
@凌驾
受保护类别getCategory(整数索引){
//TODO自动生成的方法存根
返回DbManager.getInstance(this.mContext).getCategoryByIndex(index,true);
}
@凌驾
公共布尔值areAllItemsEnabled(){
返回false;
}
@凌驾
公共布尔值isEnabled(整型位置)
{                           
if(textViewState.get(位置))
返回true;
返回false;
}
}

这可能行不通。您需要做的是重写BaseAdapter类中的两个函数,如下所示:

@Override
public boolean areAllItemsEnabled() {
    return false;
}

@Override
public boolean isEnabled(int position) {
    if(isEnabledData[pos])
        return true;

    return false;
}
这也意味着您需要向数据/模型中添加一种方法来跟踪选择状态,在我的示例中,我使用了一个简单的布尔[]和true或false。BaseAdapter在将网格项绘制到屏幕时将使用isEnabled


如果您需要更改项目的状态,请更改为模型数据isEnable[x]=true/false,然后在适配器上调用notifyDatasetChanged()。

文档中说,“启用状态的解释因子类而异。”禁用TextView后,您试图实现什么?您希望不处理触摸事件吗?您是否希望它们在触摸时不会在可拖动状态中循环?是否要应用特定的状态列表可绘制状态?请注意,
getChildCount()
仅返回当前渲染的视图。另外,由于您只更改任何可见内容的状态,因此只要滚动并调用
getView()
方法,该状态将重置为最初启用的状态。谢谢。我实现了这两个覆盖,但由于某种原因,它们在任何时候都不会被调用。我设置了一个断点,但是代码没有被调用。同样:我有一个文本视图网格,用作按钮。单击一个按钮后,我希望禁用网格中的所有其他按钮。我如何做到这一点?再次感谢!您是否可以发布更多的代码,比如扩展BaseAdapter的CustomAdapter类,以及您在onClick上所做的工作?我怀疑当您想要更改数据或有一个奇怪的BaseAdapter实现时,您可能没有调用NotifyDataSetChange。
@Override
public boolean areAllItemsEnabled() {
    return false;
}

@Override
public boolean isEnabled(int position) {
    if(isEnabledData[pos])
        return true;

    return false;
}