2017-10-19 69 views
-1

我试图创建Android的一个GridView下面的例子here,只是按钮除了图像。这是我改变了代码:为什么onClickListener在这个例子中不再工作?

public class ButtonAdapter extends BaseAdapter { 
    private Context mContext; 
    private String[] filesnames = { 
      "File 1", 
      "File 2", 
      "Roflcopters", 
      "File 1", 
      "File 2", 
      "Roflcopters", 
      "File 1", 
      "File 2", 
      "Roflcopters", 
      "File 1", 
      "File 2", 
      "Roflcopters" 
    }; 

    public ButtonAdapter(Context c) { 
     mContext = c; 
    } 

    public int getCount() { 
     return filesnames.length; 
    } 

    public Object getItem(int position) { 
     return null; 
    } 

    public long getItemId(int position) { 
     return 0; 
    } 

    // create a new ImageView for each item referenced by the Adapter 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Button btn; 
     if (convertView == null) { 
      // if it's not recycled, initialize some attributes 
      btn = new Button(mContext); 
      btn.setLayoutParams(new GridView.LayoutParams(100, 85)); 
      btn.setPadding(8, 8, 8, 8); 
     } 
     else { 
      btn = (Button) convertView; 
     }      

     btn.setText(filesnames[position]); 
     // filenames is an array of strings 
     btn.setTextColor(Color.WHITE); 
     btn.setBackgroundResource(R.drawable.sample_0); 
     btn.setId(position); 

     return btn; 
    } 
} 

,当然,我略微改变了主要的Java代码,我已经叫这个适配器和活性不同:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.select_route); 

    GridView gridview = (GridView) findViewById(R.id.selectroute_view); 
    gridview.setAdapter(new ButtonAdapter(this)); 

    gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, 
           int position, long id) { 
      Toast.makeText(SelectRoute.this, "" + position, 
        Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

一切正常,到目前为止, ,除了点击其中一个按钮时,我不会收到吐司消息。我没有看到任何错误 - 那么我做错了什么?

回答

1

在机器人时嵌套需要默认(ButtonImageButton)聚焦或可点击Android系统一个两个视图将/可能偏向一个。对于你的情况还记得你有AdapterView(这种情况下,其GridView)的布局也可点击的,这意味着这些Button太它不知道你是否想点击GridView中的行或Button行里面(如果你这样做不知道android中的网格视图和列表视图的行是可点击的,即使没有按钮内)。

所以会发生什么是Android系统不知道你想点击行或Button行里面是什么。不幸的是,可点击的行为已被给予Button,而不是您看起来设置的那一行onItemClickListener,这行不起作用。

所以要解决你有你的问题如下选择:

删除按钮,只需TextView取代它。该行将是可点击的,因为TextView不会像Button那样默认关注焦点。

2.创建自定义列。一行应该在外面定义为一个独立的视图,通过xmlButton在里面,然后你将它作为你的GridView的一行膨胀。而在这之后添加以下atrributes到视图的parent/root

android:descendantFocusability="blocksDescendants" 

这将采取全焦点,因为Button将是一个后代,将被封锁阻止Button。如果您没有连续制作多个Views的自定义GridView行,则可以使用任何教程this tutorial

最后,但最简单的选择,如果你真正爱你的布局,你不想删除您的按钮设定onClickListener尽管很难用这种方式来获取View的(Button的)位置。我们在适配器的getView()方法中添加此项。 方法如下:

public View getView(int position, View convertView, ViewGroup parent) { 
    Button btn; 
    if (convertView == null) { 
     // if it's not recycled, initialize some attributes 
     btn = new Button(mContext); 
     btn.setLayoutParams(new GridView.LayoutParams(100, 85)); 
     btn.setPadding(8, 8, 8, 8); 
    } 
    else { 
     btn = (Button) convertView; 
    }      

    btn.setText(filesnames[position]); 
    // filenames is an array of strings 
    btn.setTextColor(Color.WHITE); 
    btn.setBackgroundResource(R.drawable.sample_0); 
    btn.setId(position); 
    btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Button button=(Button)v; 
      Toast.makeText(mContext, "You clicked "+button.getText().toString()+" with ID "+button.getId(), Toast.LENGTH_SHORT).show(); 
     } 

    return btn; 
} 
0

您是否尝试过直接把点击监听器适配器中按钮?

// create a new ImageView for each item referenced by the Adapter 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Button btn; 
     if (convertView == null) { 
      // if it's not recycled, initialize some attributes 
      btn = new Button(mContext); 
      btn.setLayoutParams(new GridView.LayoutParams(100, 85)); 
      btn.setPadding(8, 8, 8, 8); 
     } 
     else { 
      btn = (Button) convertView; 
     }      

     btn.setText(filesnames[position]); 
     // filenames is an array of strings 
     btn.setTextColor(Color.WHITE); 
     btn.setBackgroundResource(R.drawable.sample_0); 
     btn.setId(position); 

     //ADD THIS, to get context just getContext from the view. 
     btn.setOnClickListener... 

     return btn; 
    } 
+0

我会尝试,但我不明白为什么它不会像原来的例子工作... – Alex

+0

随着你的建议我有局部变量访问等问题 – Alex

相关问题