2017-10-19 87 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

相關問題