Android 安卓:onClick不';在listview的可单击元素中找不到方法

Android 安卓:onClick不';在listview的可单击元素中找不到方法,android,listview,methods,onclick,onclicklistener,Android,Listview,Methods,Onclick,Onclicklistener,我有一个xml文件,其中包含一个ImageView,该文件的类型为android:onClick=“playSound”,它在我的活动中的第一个加载列表视图中运行良好:当我点击这个ImageView时,它位于列表视图的每一行中,方法playSound运行 问题是我在这个活动的顶部有一个EditText来过滤列表视图中加载的内容,过滤元素/行,例如按名称搜索(如字典)。当我写东西时,listview的元素较少,如果我点击任何行的相同的ImageView,就会出现强制关闭异常:NoSuchMetho

我有一个
xml
文件,其中包含一个
ImageView
,该文件的类型为
android:onClick=“playSound”
,它在我的
活动中的第一个加载列表视图中运行良好:当我点击这个
ImageView
时,它位于
列表视图的每一行中,方法
playSound
运行

问题是我在这个
活动的顶部有一个
EditText
来过滤
列表视图中加载的内容,过滤元素/行,例如按名称搜索(如字典)。当我写东西时,
listview
的元素较少,如果我点击任何行的相同的
ImageView
,就会出现强制关闭异常:
NoSuchMethodException:playSound

似乎
onClick
活动中找不到方法
playSound
,但它就在那里

活动

public class ListaCaracteres extends Activity{

private Context context;
private Cursor c;
private SQLiteDatabase hanyuDB;
private HanyuSQLHelper hanyuDBHelper;
private AdapterListaCaracteres adapter;
private ListView listaCaracteres;
private EditText buscador;
private ImageView play;
private MediaPlayer mediaPlayer;
private String texto = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(es.hsk.ap.R.layout.lista_caracteres);

    /*
     * Query a la base de datos, obtenemos todos los lugares en Cursor
     */
    try{
        hanyuDBHelper = new HanyuSQLHelper(this);
        hanyuDB = hanyuDBHelper.getReadableDatabase();
        c = hanyuDB.rawQuery(" SELECT * FROM Caracteres ", null);
    }
    catch(SQLiteException ex)
    {
        Toast mensajeError=Toast.makeText(getApplicationContext(), "Error accediendo a los datos", Toast.LENGTH_SHORT);
        mensajeError.show();
        Log.e("LogLugares", "Error en getReadableDatabase()", ex);
    }     


    /*
     * Utilizamos nuestro Adapter AdapterListaCaracteres con el contenido del Cursor
     */
    adapter = new AdapterListaCaracteres(this,c, true);
    listaCaracteres = (ListView)findViewById(es.hsk.ap.R.id.listaCaracteres);   
    listaCaracteres.setAdapter(adapter);       

    /*
     * Localizamos y damos funciona al buscador
     */
    buscador = (EditText)findViewById(R.id.buscador); 

    buscador.setOnKeyListener(new OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // TODO Auto-generated method stub
            texto = buscador.getText().toString();

            c = hanyuDB.rawQuery(
                    " SELECT * FROM Caracteres WHERE significado LIKE '%"
                            + texto + "%'", null);

            AdapterListaCaracteres adapter2 = new AdapterListaCaracteres(getApplicationContext(), c, false);
            listaCaracteres.setAdapter(adapter2);

            return false;
        }
    });

    /*
     * Ponemos acción al clic sobre un elemento del listview
     */
    listaCaracteres.setOnItemClickListener(new OnItemClickListener(){
        public void onItemClick(AdapterView<?> parent, View view, int position, long id){

            /*
             * Al hacer clic se inicia activity MostrarCaracter
             * El Intent enviado lleva como parámetro el id del objeto a mostrar
             */
            if(texto!=null){
                c = hanyuDB.rawQuery(
                        " SELECT * FROM Caracteres WHERE significado LIKE '%"
                                + texto + "%'", null);
                c.moveToPosition(position);
                position=c.getInt(0)-1;
            }


            Intent intent=new Intent();
            intent.setClass(getApplicationContext(), MostrarCaracter.class);                    

            intent.putExtra("idObjeto", position);
            startActivity(intent);
        }
    }); 
}


/*
 * Método para reproducir sonido de carácter
 */
public void playSound(View view){
    int posicion=listaCaracteres.getPositionForView(view);
    if(texto!=null){
        c = hanyuDB.rawQuery(
                " SELECT * FROM Caracteres WHERE significado LIKE '%"
                        + texto + "%'", null);
        c.moveToPosition(posicion);
        posicion=c.getInt(0)-1;
    }

    c = hanyuDB.rawQuery(" SELECT audio FROM Caracteres WHERE _id="+(posicion+1), null);
    c.moveToFirst();
    String audio=c.getString(0);
    int resID = getResources().getIdentifier(audio, "raw", "es.hsk.ap");
    mediaPlayer = MediaPlayer.create(this, resID);
    mediaPlayer.start();
}

日志:

    04-04 21:36:07.144: E/AndroidRuntime(5569): Uncaught handler: thread main exiting due to uncaught exception
04-04 21:36:07.164: E/AndroidRuntime(5569): java.lang.IllegalStateException: Could not find a method reproducir(View) in the activity
04-04 21:36:07.164: E/AndroidRuntime(5569):     at android.view.View$1.onClick(View.java:2020)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at android.view.View.performClick(View.java:2364)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at android.view.View.onTouchEvent(View.java:4179)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at android.view.View.dispatchTouchEvent(View.java:3709)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at android.os.Looper.loop(Looper.java:123)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at android.app.ActivityThread.main(ActivityThread.java:4363)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at java.lang.reflect.Method.invokeNative(Native Method)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at java.lang.reflect.Method.invoke(Method.java:521)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at dalvik.system.NativeStart.main(Native Method)
04-04 21:36:07.164: E/AndroidRuntime(5569): Caused by: java.lang.NoSuchMethodException: reproducir
04-04 21:36:07.164: E/AndroidRuntime(5569):     at java.lang.ClassCache.findMethodByName(ClassCache.java:308)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at java.lang.Class.getMethod(Class.java:1014)
04-04 21:36:07.164: E/AndroidRuntime(5569):     at android.view.View$1.onClick(View.java:2017)
我的自定义适配器:

public class AdapterListaCaracteres extends CursorAdapter{

private Context  mContext;
private Cursor  datos;
private boolean aRequery;
private LayoutInflater inflater;

/*
 * Constructor de la clase
 */
public AdapterListaCaracteres(Context  context, Cursor  c, boolean autoRequery){
    super(context, c, autoRequery);
    this.mContext = context;
    this.datos = c;
    this.aRequery=autoRequery;
}

public void reproducir(View view){
}

/*
 * Métodos
 */
@Override
public int getCount() {
    // TODO Auto-generated method stub
    return datos.getCount();
}

@Override
public Object  getItem(int position) {
    // TODO Auto-generated method stub
    return datos.getString(position);
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}

public View  getView(int position, View  convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    View item = convertView;
    ViewHolder holder;

    inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    datos.moveToPosition(position);

    //Comprobamos si el item existe para reaprovecharlo
    if(item==null){
        try{
            item = inflater.inflate(es.hsk.ap.R.layout.caracter, null);
        }
        catch(InflateException ex)
        {
            // lo que querais hacer en este caso,mostrar un toast o lo que sea
        }


        holder = new ViewHolder();
        holder.caracter = (TextView)item.findViewById(es.hsk.ap.R.id.caracter);
        holder.pinyin = (TextView)item.findViewById(es.hsk.ap.R.id.pinyin);
        holder.significado = (TextView)item.findViewById(es.hsk.ap.R.id.significado);
        holder.audio = (ImageView)item.findViewById(es.hsk.ap.R.id.play);

        item.setTag(holder);
    }
    else{
        holder = (ViewHolder)item.getTag();
    }           

    holder.caracter.setText(datos.getString(2));            
    holder.pinyin.setText(datos.getString(3));  
    holder.significado.setText(datos.getString(4));

    return item;

}



/*
 * Utilizamos clase ViewHolder para obtener IDs de objetos View inflados anteriormente
 * (objetos hijos del objeto convertView) y así reparovecharlos para ahorrar recursos 
 * y batería al hacer scroll. Se localizan mediante la propiedad Tag
 */
static class ViewHolder{
    TextView caracter;
    TextView pinyin;
    TextView significado;
    ImageView audio;
}



@Override
public void bindView(View view, Context context, Cursor cursor) {
    // TODO Auto-generated method stub

}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    // TODO Auto-generated method stub
    return null;
}

}

onClick将在上下文实例上查找该方法。确保用于膨胀ListView项的上下文是您的活动。

我弄错了吗,还是在LogCat中说了方法“reproductir”?然而,在xml中,您将“playSound”声明为回调。是的,但别担心,我已将其更改为post here,以放置一个英文方法名!很抱歉我明白了,你能帮我吗?我用我的apadter编辑了这篇文章,总结了我在自定义listView适配器中膨胀的地方:Context McContext;充气器=(LayoutInflater)mContext.getSystemService(Context.LAYOUT\u充气器\u SERVICE);谢谢已解决:我更改了传递给适配器的上下文,该适配器用于筛选listview,used Activity。改为GetApplicationContext():AdapterListCaracters adapter2=新AdapterListCaracteres(ListaCaracteres.this,c,false);请注意GetApplicationContext的使用,此处有大量信息:
public class AdapterListaCaracteres extends CursorAdapter{

private Context  mContext;
private Cursor  datos;
private boolean aRequery;
private LayoutInflater inflater;

/*
 * Constructor de la clase
 */
public AdapterListaCaracteres(Context  context, Cursor  c, boolean autoRequery){
    super(context, c, autoRequery);
    this.mContext = context;
    this.datos = c;
    this.aRequery=autoRequery;
}

public void reproducir(View view){
}

/*
 * Métodos
 */
@Override
public int getCount() {
    // TODO Auto-generated method stub
    return datos.getCount();
}

@Override
public Object  getItem(int position) {
    // TODO Auto-generated method stub
    return datos.getString(position);
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}

public View  getView(int position, View  convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    View item = convertView;
    ViewHolder holder;

    inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    datos.moveToPosition(position);

    //Comprobamos si el item existe para reaprovecharlo
    if(item==null){
        try{
            item = inflater.inflate(es.hsk.ap.R.layout.caracter, null);
        }
        catch(InflateException ex)
        {
            // lo que querais hacer en este caso,mostrar un toast o lo que sea
        }


        holder = new ViewHolder();
        holder.caracter = (TextView)item.findViewById(es.hsk.ap.R.id.caracter);
        holder.pinyin = (TextView)item.findViewById(es.hsk.ap.R.id.pinyin);
        holder.significado = (TextView)item.findViewById(es.hsk.ap.R.id.significado);
        holder.audio = (ImageView)item.findViewById(es.hsk.ap.R.id.play);

        item.setTag(holder);
    }
    else{
        holder = (ViewHolder)item.getTag();
    }           

    holder.caracter.setText(datos.getString(2));            
    holder.pinyin.setText(datos.getString(3));  
    holder.significado.setText(datos.getString(4));

    return item;

}



/*
 * Utilizamos clase ViewHolder para obtener IDs de objetos View inflados anteriormente
 * (objetos hijos del objeto convertView) y así reparovecharlos para ahorrar recursos 
 * y batería al hacer scroll. Se localizan mediante la propiedad Tag
 */
static class ViewHolder{
    TextView caracter;
    TextView pinyin;
    TextView significado;
    ImageView audio;
}



@Override
public void bindView(View view, Context context, Cursor cursor) {
    // TODO Auto-generated method stub

}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    // TODO Auto-generated method stub
    return null;
}