2013-02-08 61 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