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