0

我有一个带有 属性的xml文件,它在我的第一个加载的列表视图中运行良好:当我单击它位于 的每一行时,该方法运行。 ImageViewandroid:onClick="playSound"ActivityImageViewlistviewplaySound

问题是我在这个的顶部Activity过滤EditText了加载的内容listview,过滤元素/行,例如按名称搜索(如字典)。当我写东西并且listview元素较少时,如果我单击ImageView任何行的相同内容,则会出现强制关闭异常:NoSuchMethodException: playSound

似乎onClick找不到playSound里面的方法Activity,但它就在那里。

Activity

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

xml我的适配器中的膨胀文件,具有ImageView (id play)可点击性和onClick操作性

<TableRow
    android:id="@+id/tableRow1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingTop="5dp" >

<TextView
    android:id="@+id/caracter"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:paddingLeft="5dp"
    android:paddingRight="15dp"
    android:paddingBottom="5dp"
    android:textSize="28dp" />

<TextView
    android:id="@+id/pinyin"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="24dp" />

<LinearLayout
    android:id="@+id/linearLayout1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:gravity="right" >

    <ImageView
        android:id="@+id/play"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@string/icono"
        android:paddingRight="7dp"
        android:onClick="playSound"
        android:src="@drawable/speaker" />
</LinearLayout>

</TableRow>

<TableRow
    android:id="@+id/tableRow2"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="5dp" >

<TextView
    android:id="@+id/significado"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="5dp"
    android:textSize="16dp" />

</TableRow>

日志猫:

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

}

4

1 回答 1

2

onClick 将在 Context 实例上查找方法。确保用于膨胀 ListView 项目的 Context 是您的 Activity。

于 2012-04-04T22:04:59.347 回答