2017-10-19 16 views
-1

J'essaye de créer un GridView dans android suivant l'exemple here, juste avec les boutons excepté des images. Voici le code que j'ai changé:Pourquoi le onClickListener ne fonctionne plus dans cet exemple?

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; 
    } 
} 

et, bien sûr, je légèrement changé le principal code java comme je l'ai nommé cet adaptateur et l'activité différemment:

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(); 
     } 
    }); 
} 

Tout fonctionne bien jusqu'à présent , sauf qu'en cliquant sur l'un de ces boutons, je ne reçois pas de message toast. Je ne vois aucune erreur - alors qu'est-ce que je fais mal?

Répondre

1

Dans android quand un deux points de vue qui nichaient besoin d'une mise au point ou cliquable par défaut (ou ButtonImageButton) le système Android va/peut favoriser un. Pour votre cas rappelez-vous que vous avez AdapterView (ce cas son GridView) a une disposition qui est également cliquable qui signifie Button s donc il ne sait pas si vous voulez cliquer sur la ligne de la GridView ou Button dans la rangée (si vous faites ne sais pas dans les rangées android de la vue de la grille et la vue de la liste sont cliquables, même sans un bouton à l'intérieur d'eux).

Donc, ce qui se passe est le système Android ne sait pas ce que vous voulez cliquer sur la ligne ou le Button à l'intérieur de la ligne. Et malheureusement, le comportement cliquable a été donné à la Button et non la ligne que vous semblez définir onItemClickListener qui ne fonctionne pas.

Donc, pour résoudre vos problèmes que vous avez les solutions suivantes:

1. Retirez le bouton et le remplacer par juste un TextView. La ligne sera cliquable puisque le TextView ne prendra pas le focus par défaut comme un Button.

2. Créer une ligne personnalisée. Une ligne doit être définie à l'extérieur en tant que vue indépendante via xml et le Button à l'intérieur puis vous le gonfler en tant que ligne pour votre GridView. Et après cela ajouter les atrributes suivants à la parent/root de la vue

android:descendantFocusability="blocksDescendants" 

Ceci va bloquer la Button de prendre toute attention parce que le Button sera un descendant et sera bloqué. Si vous ne savez pas comment créer des lignes personnalisées GridView de plusieurs vues à la suite, utilisez un didacticiel this tutorial.

3. La dernière mais la plus simple alternative si vous aimez votre vraie mise en page et vous ne voulez pas retirer votre bouton l'ensemble onClickListener mais il est difficile d'obtenir la position « s (Button » s) View utilisant cette façon . Nous ajoutons ceci dans la méthode getView() de votre carte. Voici comment:

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

Avez-vous essayé de placer le programme d'écoute de clic directement sur le bouton de l'adaptateur?

// 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

Je vais essayer, mais je ne comprends pas pourquoi il ne fonctionne pas comme l'exemple d'origine ... – Alex

+0

Avec votre suggestion j'ai des problèmes avec la variable locale accédant etc. – Alex