#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 как имя.