2011-06-17 5 views
1

dans mon application j'utilise le bouton d'image dans la vue liste. J'écris l'action pour chaque bouton d'image. mais je reçois java.lang.NoSuchMethodException: exception onClick. Je ne connais pas la raison de l'erreur s'il vous plaît aidez-moi. comment écrire une action pour les boutons d'image. Merci d'avance.java.lang.NoSuchMethodException: onClick dans la vue de liste sur android

public class InventoryListActivity extends ListActivity { 
    private InventoryAdapter adapter; 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.inventory_list); 
    adapter = new InventoryAdapter(this); 
    setListAdapter(adapter); 
} 
} 

en activité InventoryAdapter:

public class InventoryAdapter extends BaseAdapter implements Observer,OnClickListener { 


public InventoryAdapter(Context ctx) {  
    context = ctx; 
    inventory = IAPManager.shared().getInventory(); 
    inventory.addObserver(this); 
    inventory.load(); 
} 

public void update(Observable o, Object arg) { 

    switch (((Inventory)arg).getStatus()) { 
    case LOADED: 
     this.notifyDataSetChanged(); 
     break; 
    default: 
     break; 
    } 
} 

@Override 
public int getCount() { 
    return inventory.size(Inventory.FilterType.ALL); 
} 

@Override 
public Object getItem(int position) { 
    return inventory.getProducts(Inventory.FilterType.ALL).get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    Product product = (Product) getItem(position); 

    View view; 

    if(convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) 
     context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(R.layout.inventory_list_item, null); 
    } 

    else { 
     view = convertView; 
    } 

    play = (ImageButton)findViewById(R.id.imageButton2); 
    detail = (ImageButton)findViewById(R.id.imageButton3); 
    buy = (ImageButton)findViewById(R.id.imageButton2); 

    play.setTag(position); 
    detail.setTag(position); 
    buy.setTag(position); 

    titleView = (TextView) view.findViewById(R.id.product_title); 
    titleView.setText(product.getTitle()); 


    iconView = (ImageView) view.findViewById(R.id.product_icon); 

    String iconURL = product.getIconURLString(); 

    if(AsyncImageLoader.contains(iconURL)) { 
     iconView.setImageDrawable(AsyncImageLoader.get(iconURL)); 
    } 

    else { 
     iconView.setImageDrawable(null); 
     new AsyncImageLoader(product.getIconURLString(), new AsyncImageLoader.Delegate(){ 
      public void imageLoaded(String urlString, Drawable imageDrawable) { 
       notifyDataSetChanged(); 
      } 
     }); 
    } 

    descriptionView = (TextView) view.findViewById(R.id.product_description); 
    descriptionView.setText(product.getDescription()); 

    return view; 
} 

private ImageButton findViewById(int imagebutton2) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public void onClick(View v) { 

    Log.e("onclick","onclick"); 
    Integer position = (Integer) v.getTag(); 
    switch(v.getId()){ 
    case R.id.imageButton1: 
     Log.e("Buy","buy position"+position); 

    break; 
    case R.id.imageButton2: 
     Log.e("play","play position"+position); 
    break; 
    case R.id.imageButton3: 
     Log.e("detail","detail position"+position); 
    break; 
    }  
} 

}

xml:

  <ImageButton android:background="@drawable/play_btn" android:focusable="false" android:onClick="onClick" 
      android:layout_width="wrap_content" android:layout_height="wrap_content" 
      android:id="@+id/imageButton2" android:layout_weight="0.5" /> 
+0

pas 100% sûr, mais je pense que la méthode onClick() est recherchée dans l'activité, pas dans l'adaptateur – Gryphius

Répondre

2

Je pense que le problème est que vous essayez de câbler l'auditeur onClick via XML, mais implémentez-le dans votre adaptateur. Je pense que Android ne reconnaît tout simplement pas l'écouteur onClick ou ne sait pas qui devrait être utilisé pour le ImageButton. Essayez d'implémenter et d'ajouter dynamiquement OnClickListener dans la méthode getView().

MISE À JOUR

Vérifiez la première instruction if de la méthode getView(). Là, OnClickListener sera défini pour les 3 boutons. Lorsque votre adaptateur implémente l'interface OnClickListener, vous passez l'adpater à la méthode. Vous devez également supprimer l'attribut android:onClick="onClick" de vos ImageButtons dans le fichier XML de mise en page.

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Product product = (Product) getItem(position); 

     View view; 

     if(convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) 
      context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = inflater.inflate(R.layout.inventory_list_item, null); 

      play = (ImageButton)findViewById(R.id.imageButton2); 
      detail = (ImageButton)findViewById(R.id.imageButton3); 
      buy = (ImageButton)findViewById(R.id.imageButton2); 

      // Set the OnClickListener for the 3 image buttons. 
      play.setOnClickListener(this); 
      detail.setOnClickListener(this); 
      buy.setOnClickListener(this); 

     } 

     else { 
      view = convertView; 
     } 

     play = (ImageButton)findViewById(R.id.imageButton2); 
     detail = (ImageButton)findViewById(R.id.imageButton3); 
     buy = (ImageButton)findViewById(R.id.imageButton2); 

     play.setTag(position); 
     detail.setTag(position); 
     buy.setTag(position); 

     titleView = (TextView) view.findViewById(R.id.product_title); 
     titleView.setText(product.getTitle()); 


     iconView = (ImageView) view.findViewById(R.id.product_icon); 

     String iconURL = product.getIconURLString(); 

     if(AsyncImageLoader.contains(iconURL)) { 
      iconView.setImageDrawable(AsyncImageLoader.get(iconURL)); 
     } 

     else { 
      iconView.setImageDrawable(null); 
      new AsyncImageLoader(product.getIconURLString(), new AsyncImageLoader.Delegate(){ 
       public void imageLoaded(String urlString, Drawable imageDrawable) { 
        notifyDataSetChanged(); 
       } 
      }); 
     } 

     descriptionView = (TextView) view.findViewById(R.id.product_description); 
     descriptionView.setText(product.getDescription()); 

     return view; 
    } 
+0

comment résoudre ce problème s'il vous plaît aidez-moi. –

+0

Vérifiez la mise à jour de ma réponse. – Flo

+0

merci et désolé pour le retard, mais si j'utilise l'intention pour l'activité suivante avec des valeurs "Intent i = new Intent (getBaseContext(), ProductDetailActivity.class);" et "startActivity (i);". L'erreur getBaseContext() et startActivity "La méthode getBaseContext() n'est pas définie pour le type InventoryAdapter". Aidez-moi, s'il vous plaît. –

0

je l'ai fait une chose semblable, mais dans l'activité principale (où le listview est déclaré) J'ai ajouté ceci:

listView.setOnItemClickListener(new OnItemClickListener(){ 
     public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { 
       switch(view.getId()){ 
        case R.id.imageButton1: 
         Log.e("Buy","buy position"+position); 
         break; 
        case R.id.imageButton2: 
         Log.e("play","play position"+position); 
         break; 
        case R.id.imageButton3: 
         Log.e("detail","detail position"+position); 
         break; 
       }  
    }); 
+0

comment déclarer en XML est-il correct ?. puis-je utiliser ci-dessus code quelle classe étend ListActivity? dans mon cas public class InventoryListActivity. –

+0

aidez-moi s'il vous plaît. –

+0

J'ai essayé votre code, mais je reçois le Caused par: java.lang.NoSuchMethodException: erreur onItemClick. en XML, je donne . S'il vous plaît aidez-moi –

1

Vous devez supprimer l'androïde: onclick = « onClick » à partir de votre XML, car ImageButton ne sait pas ce que cela signifie. C'est pourquoi vous obtenez une exception NoSuchMethodException lors de l'exécution.

Vous devez également supprimer la méthode findViewById qui renvoie null - cela ne provoquera que des problèmes.

N'implémentez pas OnClickListener, ce n'est pas ce que vous voulez pour cela. Et puis, débarrassez-vous de votre méthode onClick. Au lieu de cela, vous devez définir un nouvel OnClickListener pour chaque ImageButton. Comme ceci:

play.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View arg0) { 
     Log.i("play","play button clicked"); 
    } 
}); 

Faites cela pour chacun des boutons Image "play", "detail" et "buy". Notez que vous pouvez utiliser n'importe quelle variable définie comme finale.

final Product product = (Product)getItem(position); 

detail.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View arg0) { 
     Log.i("detail", "clicked for product " + product.toString()); 
    } 
} 

J'espère que cela vous oriente dans la bonne direction.

+0

J'avais une disposition composée dans laquelle 'Button' avait un attribut' android: onClick' qui me donnait une exception 'java.lang.NoSuchMethodException' quand je cliquais dessus. Cela a fait l'affaire! – Saurabh

0

Si votre mise en page est gonflé dans un Fragment où vous voulez attraper le onClick comme spécifié par le XML, il pourrait être dirigé vers votre Activity principal.

J'ai un ViewPager qui montre un certain nombre de fragments. Chaque fragment a un ImageView cliquable qui devrait appeler changePicture lorsqu'on clique dessus, mais le code du fragment n'est pas appelé, c'est le Activity principal qui reçoit l'appel. Donc la façon dont je l'ai résolu est de définir onClickListener comme beaucoup l'ont mentionné.

Questions connexes