【问题标题】:Android GridView first button not workingAndroid GridView第一个按钮不起作用
【发布时间】:2013-12-09 13:17:51
【问题描述】:

我在使用 Android GridView 时遇到了奇怪的问题。我创建了一个 3x4 网格并将按钮插入该网格。我希望在用户单击该按钮时更改按钮的背景。这对除第一个按钮(索引为 0 的按钮 - 左上角)之外的所有按钮都有效。无论我做什么,OnClick 事件侦听器都不会触发该按钮。

这是我创建视图的代码:

public View getView(int position, View convertView, ViewGroup parent) {
    Button imageView;

    if (convertView == null) {  // if it's not recycled, initialize some attributes
        Log.w("NOVO", "narejena nova celica");
        imageView = new Button(mContext);

        imageView.setPadding(8, 8, 8, 8);
    } else {
        Log.w("STARO", "stara celica");
        imageView = (Button) convertView;
    }

    imageView.setEnabled(true);

    int visina = parent.getHeight();
    int sirina = parent.getWidth();

    float dip = mContext.getResources().getDisplayMetrics().density;
    float margin = 10*dip;

    int view_height = (int)(visina - 3*margin)/4;
    int view_width = (int)(sirina - 2*margin)/3;

    int view_dim = 0;
    if (view_height <= view_width)
        view_dim = view_height;
    else
        view_dim = view_width;

    imageView.setLayoutParams(new GridView.LayoutParams(view_dim, view_dim));

    imageView.setId(position);
    imageView.setOnClickListener(celice.get(position));
    /*imageView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            //Toast toast = Toast.makeText(mContext, v.getId() + "bla", Toast.LENGTH_SHORT);
            //toast.show();
            celice.get(v.getId()).celicaVisible(4000);
        }});*/

    celice.get(position).id = position;
    celice.get(position).setButton(imageView);

    return imageView;
}

如果我替换

imageView = (Button) convertView;

imageView = new Button(mContext);

然后 onClick() 被触发,但背景仍然没有改变。所有其他按钮都按预期工作。

这是负责实际工作的自定义类“Celica” - 更改背景...

public class Celica implements OnClickListener {

public boolean odkrit;
public boolean najden;
public int id;
public Drawable slikca1, slikca2;
public Celica par;
private Timer tim;
public Button but;
public Context con;
static int buttonsVisible = 0;

Celica(Drawable s1, Drawable s2) {
    this.slikca1 = s1;
    this.slikca2 = s2;
}

void celicaVisible(int millis) {
    if (odkrit)
        return;

    Log.w("TEST", "prizganih " + buttonsVisible);
    if (buttonsVisible >= 2)
        return;

    odkrit = true;
    buttonsVisible++;
    tim = new Timer();
    tim.schedule(new timerDone(), millis);

    ((Activity)con).runOnUiThread(new Runnable() {
           @Override
           public void run() {
               but.setBackground(slikca2);
           }
    });

}

void setButton(Button b) {
    but = b;

    ((Activity)con).runOnUiThread(new Runnable() {
        @Override
        public void run() {
           but.setBackground(slikca1);
        }
 });
}

class timerDone extends TimerTask {

    @Override
    public void run() {
        if (!najden) {
            odkrit = false;

            ((Activity)con).runOnUiThread(new Runnable() {
                   @Override
                   public void run() {
                       but.setBackground(slikca1);
                   }
            });
        }

        buttonsVisible--;
        tim.cancel();
    }

}

@Override
public void onClick(View v) {
    celicaVisible(4000);
}

}

【问题讨论】:

  • 只使用TextView 而不是Button
  • 为什么会有所不同?不过我试过了 - 没有变化。
  • @user3082900 检查我的答案...
  • 因为按钮可以自己点击,并且会消耗触摸事件

标签: android button gridview


【解决方案1】:

在 Android 中,任何View 的 ID 都必须是非零且非负数。表示 View ID 应该 > 0。当您将 ID 设置为 Button 时会出现问题

 imageView.setId(position)

当位置为零时,按钮的 ID 将为零(表示第一项)。可能是由于这个原因,First Button 的 OnClickListener 没有被触发...尝试将大于零的 ID 设置为 Button 并尝试一次...

你可以这样写

imageView.setId(position+1) to ensure ID > 0

【讨论】:

  • 我不知道。但遗憾的是它并没有改变任何东西。
  • 它是一些自定义类的 ArrayList,它执行实际工作。我已经更新了原始帖子以包含该类的外观。
【解决方案2】:

我真的想通了。如果我使用 onClick() 方法提供的视图而不是在创建 Celica 对象时保存实际按钮,那么一切正常。

所以基本上添加:

but = (Button) v;

到 onClick() 方法解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多