2013-02-08 62 views
1

我想在android中构建一个ListView,其中ListView的每个项目由一个ImgeView和4 TexView组成。我的类的getView扩展BaseAdapter定义如下:错误ListView与图像

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View vi=convertView; 
    ViewHolder holder; 

    if(vi == null) { 
     LayoutInflater inflater = (LayoutInflater) Activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     vi = inflater.inflate(R.layout.item_lista_restaurantes, null); 

     holder = new ViewHolder(); 
     holder.nombreRestaurante= (TextView) vi.findViewById(R.id.etiquetaNombreResItemRes); 
     holder.direccionRestaurante = (TextView) vi.findViewById(R.id.etiquetaDireccionResItemRes); 
     holder.ciudadRestaurante = (TextView) vi.findViewById(R.id.etiquetaCiudadResItemRes); 
     holder.telefonoRestaurante = (TextView) vi.findViewById(R.id.etiquetaTelResItemRes); 
     holder.lineaLogo = (TextView) vi.findViewById(R.id.etiquetaLineaLogo); 

     vi.setTag(holder);  
    } 

    else 
    { 
     holder = (ViewHolder)vi.getTag(); 
    } 

    itemRestaurante item= this.itemR.get(position); 

    ImageView image = (ImageView) vi.findViewById(R.id.imageLogoItemRestaurante); 
    int imageResource = this.Activity.getResources().getIdentifier(item.getRutaImaLogo(), null, this.Activity.getPackageName()); 
    image.setImageDrawable(this.Activity.getResources().getDrawable(imageResource));   
    holder.nombreRestaurante.setText(item.getNombreR());   
    holder.direccionRestaurante.setText(item.getDireccionR());  
    holder.ciudadRestaurante.setText(item.getCiudadR());   
    holder.telefonoRestaurante.setText(item.getTelR());  
    holder.lineaLogo.setText(item.getDireccionR()); 

    return vi; 
} 

getView代码行:

ImageView image = (ImageView) vi.findViewById(R.id.imageLogoItemRestaurante); 
    int imageResource = this.Activity.getResources().getIdentifier(item.getRutaImaLogo(), null, this.Activity.getPackageName()); 
    image.setImageDrawable(this.Activity.getResources().getDrawable(imageResource)); 

这是itemRestaurantes类,其中i返回rutaImagenLogo值

package clasesExtras; 

public class itemRestaurante { 

    private long idRestaurante; 
    private String nombreRestaurante; 
    private String direccionRestaurante; 
    private String ciudadRestaurante; 
    private String telefonoRestaurante; 
    private String rutaImagenLogo; 
    //private String rutaImagenGo; 
    //private String rutaImagenLineaLogo; 

    /*Constructor*/ 
    public itemRestaurante(long id, String nombre, String direccion, String ciudad, 
          String telefono, String rutaLogo){ 

     this.idRestaurante= id; 
     this.nombreRestaurante= nombre; 
     this.direccionRestaurante= direccion; 
     this.ciudadRestaurante= ciudad; 
     this.telefonoRestaurante= telefono; 
     this.rutaImagenLogo= rutaLogo; 
     //this.rutaImagenGo= rutaGo; 
     //this.rutaImagenLineaLogo = rutaLineaLogo; 
    } 


    public long getId(){   
     return this.idRestaurante; 
    } 

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

    public String getNombreR(){  
     return this.nombreRestaurante; 
    } 

    public void setNombreR(String nombre){  
     this.nombreRestaurante=nombre; 
    } 

    public String getDireccionR(){  
     return this.direccionRestaurante; 
    } 

    public void setDireccionR(String direccion){ 
     this.direccionRestaurante=direccion; 
    } 

    public String getCiudadR(){ 
     return this.ciudadRestaurante; 
    } 

    public void setCiudadR(String ciudad){ 
     this.ciudadRestaurante= ciudad; 
    } 

    public String getTelR(){ 
     return this.telefonoRestaurante; 
    } 

    public void setTelR(String telefono){ 
     this.telefonoRestaurante= telefono; 
    } 

    public String getRutaImaLogo(){ 
     return this.rutaImagenLogo; 
    } 

    public void setRutaImaLogo(String imagenLogo){ 
     this.rutaImagenLogo= imagenLogo; 
    } 

这是活动类,其中我填充ArrayList的每个项目的信息ListView

package appetite.apptitud; 

import java.util.ArrayList; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.Spinner; 
import clasesExtras.ArrayAdapterRestaurantes; 
import clasesExtras.itemRestaurante; 


public class ListaRestaurantes extends Activity { 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.lista_restaurantes); 
     getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); //forza a android a ocultar el teclado virtual 


     ListView lista = (ListView)findViewById(R.id.listaRestaurantes);   
     ArrayList<itemRestaurante> itemRestaurante = obtenerItems();     
     ArrayAdapterRestaurantes adapter = new ArrayAdapterRestaurantes(this, itemRestaurante); 

     lista.setAdapter(adapter);   



    } 

    //Método para llenar la lista de los restaurantes. 
    private ArrayList<itemRestaurante> obtenerItems(){ 
     ArrayList<itemRestaurante> items = new ArrayList<itemRestaurante>(); 

     items.add(new itemRestaurante(1, "Frisby", "Cra. 7a 24-74", "Pereira", "3168899", "drawable/frisby_logo")); 
     items.add(new itemRestaurante(2, "Big Pollo", "Cra. 5a 34-12", "Pereira", "3147152", "drawable/bigpollo")); 
     items.add(new itemRestaurante(3, "Wingz", "Cra. 8a 18-62", "Pereira", "3391000", "drawale/wingz")); 
     items.add(new itemRestaurante(4, "Sir Pollo", "Cra. 7a 20-04", "Pereira", "3357913", "drawable/sirpollo")); 

     return items; 
    } 

上述代码作出参考,其中它被存储在图像路径(绘制文件夹),并且我要显示在列表视图的每个项目这个图像,但是这会跳转到以下错误:

FATAL EXCEPTION: main 
android.content.res.Resources$NotFoundException:Resource ID #0x0 
at android.content.res.Resources.getValue(Resources.java:1014) 
at android.content.res.Resources.getDrawable(Resources.java:659) 
at clasesExtras.ArrayAdapterRestaurantes.getView(ArrayAdapterRestaurantes.java:56) 

有人告诉我,imageResource的值是0.并且0不是有效的资源ID。我怎样才能解决这个问题? 请帮助我,我不明白

+0

您可以提供更多关于如何存储图像资源以及代码如何引用它们的信息。什么'item.getRutaImaLogo()'应该返回什么样的例子?看起来您可能会遇到问题,因为该方法指向的图像不存在。 – MattDavis 2013-02-08 16:27:31

+2

为什么不做directry image.setImageResource(R.drawable.your_picture)? – 2013-02-08 16:29:17

+0

我修好了。我错了,而我正在建立图像路径,当我添加第三项“itemRestaurante” – Are0215 2015-07-24 19:12:19

回答

0

我认为imageResource是0.检查此值。

getIdentifier Returns int The associated resource identifier. Returns 0 if no such resource was found. (0 is not a valid resource ID.)

+0

我该如何解决这个值? – Are0215 2013-02-08 20:45:34

+0

检查getIdentifier参数。或者更好的是不要使用它,并通过它的id来获取drawable。将“drawable/frisby_logo”更改为R.drawable.frisby_logo,将String rutaImagenLogo更改为int rutaImagenLogo。使用image.setImageDrawable(item.getRutaImaLogo())。这是更快,更不容易出错。 – Leonidos 2013-02-09 07:26:33

0

你将不得不列表视图

这将是Restaurant.java

public class Restaurant{ 
    public int icon; 
    public String someText; 
    public String moreText; 
    public String someMoreText; 
    public String evenMoreText; 

public Restaurant(int icon, String someText, String moreText, String somMoreText, String evenMoreText) 
    super.(); 
    this.someText = someText; 
    this.moreText = moreText; 
    this.someMoreText = someMoreText; 
    this.evenMoreText = evenMoreText; 
    this.icon = icon; 
} 

这里创建一个自定义适配器是自定义适配器RestaurantAdapter.java

public class RestaurantAdapter extends<Restaurant> } 
    Context context; 
    int layoutResourceId; 
    Restaurant data[] = null; 

    public RestaurantAdapter(Context context, int layoutResourceId, Restaurant[] data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     RestaurantHolder holder = null; 

     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new RestaurantHolder(); 
      holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon); 
      holder.txtID1 = (TextView)row.findViewById(R.id.txtID1); 
      holder.txtID2 = (TextView)row.findViewById(R.id.txtID2); 
      holder.txtID3 = (TextView)row.findViewById(R.id.txtID3); 
      holder.txtID4 = (TextView)row.findViewById(R.id.txtID4); 

      row.setTag(holder); 
     } 
     else 
     { 
      holder = (RestauantHolder)row.getTag(); 
     } 

     Restaurant restaurant = data[position]; 
     holder.txtID1.setText(restaurant.someText); 
     holder.txtID1.setText(restaurant.moreText); 
     holder.txtID1.setText(restaurant.someMoreText); 
     holder.txtID1.setText(restaurant.evenMoreText); 
     holder.imgIcon.setImageResource(restarant.icon); 

     return row; 
    } 
} 
static class RestaurantHolder 
{ 
ImageView imgIcon; 
TextView txtID1; 
TextView txtID2; 
TextView txtID3; 
TextView txtID4; 
} 

现在在你的活动中,将会是这样的电话

Restaurant restaurant_data[] = new Restaurant[] 
    { 
     new Restaurant(R.drawable.pic1, "some text", "more text", "some more text". "even more text"), 
     new Restaurant(R.drawable.pic2, "text", "more", "some more", "blah"), 
     new Restaurant(R.drawable.pic3, "blah1", "blah2", "blah3" "blah3"), 
     new Restaurant(R.drawable.pic4, "you get the idea", "blah", "blah", "blah"), 

    }; 

    RestaurantAdapter adapter = new RestaurantAdapter(this, 
      R.layout.listview_item_row, restaurant_data); 


    listView1 = (ListView)findViewById(R.id.listView1); 

积分转到http://www.ezzylearning.com/tutorial.aspx?tid=1763429 您只需更改一些名称即可。

+0

我试着实现你的例子,但'decodeResource'中的'R.drawable.pic_name'只能在一个图像上引用,而且我的图像有几个图像。 我能做什么? – Are0215 2013-02-08 21:00:40

+0

查看我的编辑多张照片 – Zabador 2013-02-11 19:56:31