Ошибка запуска действия с использованием пользовательского ListView

#android #listview #android-studio

#Android #listview #android-studio

Вопрос:

Я выполнял пользовательский ListView и хочу открыть другой класс, когда я нажимаю на какой-либо элемент в ListView.

Итак, я запустил адаптер, класс, activity и его XML-файлы.

Класс:

 public class DatosMercado {
protected Drawable foto;
protected String titulo;
protected String info;
protected long id;

public DatosMercado(Drawable foto, String titulo, String info){
    this.foto = foto;
    this.titulo = titulo;
    this.info = info;


}

public Drawable getFoto(){
    return foto;
}

public void setFoto(Drawable foto){
    this.foto = foto;
}
public String getTitulo(){
    return titulo;
}

public void setTitulo(String titulo){
    this.titulo = titulo;
}

public String getInfo(){
    return info;
}

public void setInfo(String info){
    this.info = info;
}

public long getId(){
    return id;
}
public void setId(long id){
    this.id = id;
}
  

}

Адаптер:

 public class AdapterDatosMercado extends BaseAdapter {

protected Activity activity;
//Asignamos la clase DatosMercado al arrayadapter
protected ArrayList<DatosMercado> items;

//Metodo constructor de la clase
public AdapterDatosMercado(Activity activity, ArrayList<DatosMercado> items){
    this.activity = activity;
    this.items = items;
}
@Override
public int getCount() {
    return items.size();
}

@Override
public Object getItem(int position) {
    return items.get(position);
}

@Override
public long getItemId(int position) {
    return items.get(position).getId();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View v = convertView;
    //Asociar el Layout de la lista que hemos creado
    if(convertView == null){
        LayoutInflater inf = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = inf.inflate(R.layout.mercado2, null);
    }
    //Creamos un objeto de la clase DatosMercado
    DatosMercado datos = items.get(position);
    //Relleno la foto
    ImageView foto = (ImageView) v.findViewById(R.id.Photo);
    foto.setImageDrawable(datos.getFoto());
    //Rellenamos el nombre
    TextView titulo = (TextView) v.findViewById(R.id.Title);
    titulo.setText(datos.getTitulo());
    //Rellenamos la informacion
    TextView info = (TextView) v.findViewById(R.id.Description);
    info.setText(datos.getInfo());

    //retornamos la vista
    return v;
}
  

}

И у меня проблема с действием, если я выполняю этот код, появляется сообщение об ошибке:

Не удается запустить activity ComponentInfo{edu.upc.com.game/edu.upc.com.game.Mercado}: java.lang.RuntimeException: ваш контент должен иметь ListView с атрибутом id ‘android.R.id.list’

Вот мой код:

 public class Mercado extends ListActivity  {

String classnames[] = {"BuscarColtan"};
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mercado);

    ListView lista = (ListView) findViewById(R.id.listamoviles);
    ArrayList<DatosMercado> arraydatos = new ArrayList<DatosMercado>();
    DatosMercado datos;

    //Datos introducidos

    datos = new DatosMercado(getResources().getDrawable(R.drawable.ipear), "IPear", "La mejor marca del mundo");
    arraydatos.add(datos);
    datos = new DatosMercado(getResources().getDrawable(R.drawable.ipear), "Bensung", "Moviles Star de alta gama");
    arraydatos.add(datos);
    datos = new DatosMercado(getResources().getDrawable(R.drawable.ipear), "HiYou", "Venimos desde China a dar el salto al mercado europeo");
    arraydatos.add(datos);
    datos = new DatosMercado(getResources().getDrawable(R.drawable.ipear), "IQ", "Moviles de alta tecnologia a bajo coste");
    arraydatos.add(datos);
    datos = new DatosMercado(getResources().getDrawable(R.drawable.ipear), "Zonya", "No te resistiras a comprar nuestros Hesperia");
    arraydatos.add(datos);
    datos = new DatosMercado(getResources().getDrawable(R.drawable.ipear), "Hullaguey", "Los mobiles mas baratos");
    arraydatos.add(datos);


    //Crear el Adapter personalizado
    AdapterDatosMercado adapter = new AdapterDatosMercado(this,arraydatos);

    //Aplicarlo
    lista.setAdapter(adapter);




}

protected void onListItemClick(ListView lv, View v, int position, long id){
    super.onListItemClick(lv,v,position,id);
    String openClass = classnames[position];
    try {
        Class selected = Class.forName("edu.upc.com.game. "  openClass);
        Intent selectedIntent = new Intent(this,selected);
        startActivity(selectedIntent);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}
  

}

Исходное имя ListView:

 android:id="@ id/listamoviles"
  

Я изменил его на:

 android:id="@android:id/list"
  

Но теперь у меня проблема с этой строкой:

 ListView lista = (ListView) findViewById(R.id.listamoviles);
  

Я должен определить это представление списка, потому что, если я этого не сделаю, оно не сработает. Приложение работает, если я удаляю onListItemClick и меняю ListActivity на Activity, но я хочу открыть другое действие (класс), щелкнув по настраиваемому listview.

Большое спасибо!

Ответ №1:

Если вы расширяете ListActivity , удалите эту строку

  ListView lista = (ListView) findViewById(R.id.listamoviles);
  

также замените

   lista.setAdapter(adapter);
  

Автор:

   setListAdapter(adapter);
  

Комментарии:

1. Он продолжает терпеть неудачу, потому что проблема в том, что если я изменю имя на android:id="@android:id/list" строку: ListView lista = (ListView) findViewById(R.id.listamoviles); это не сработает, и мне нужно изменить имя listamoviles, но я не могу поместить /list как имя.