2015-07-10 92 views
0

我使用一個ListView,以顯示它的項目相同的項目,這是該單元的佈局:適配器返回

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:weightSum="1"> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="@string/lon" 
    android:id="@+id/textView5" 

    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" /> 

<ImageView 
    android:layout_width="80dp" 
    android:layout_height="80dp" 
    android:id="@+id/foto" 
    android:layout_alignParentTop="true" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="@string/lat" 
    android:id="@+id/textView6" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentEnd="true" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceSmall" 
    android:text="Small Text" 
    android:id="@+id/textlon" 
    android:layout_alignBottom="@+id/foto" 
    android:layout_centerHorizontal="true" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceSmall" 
    android:text="Small Text" 
    android:id="@+id/textlat" 
    android:layout_alignTop="@+id/textlon" 
    android:layout_alignParentEnd="true" /> 
</RelativeLayout> 

像每一個ListView控件,它需要一個適配器:

public class FotoAdapter extends BaseAdapter { 
private ArrayList<BeanFotos> fotos; 
private LayoutInflater inflater=null; 
Context c; 

public FotoAdapter(Context c, ArrayList<BeanFotos> fotos){ 
    this.fotos=fotos; 
    inflater=LayoutInflater.from(c); 
    this.c=c; 

} 
@Override 
public int getCount() { 
//this returns the proper size of the array, if I have 3 photos it returns 3 
    Log.i("David", "In adapter, the size of the array is: "+fotos.size()); 
    return fotos.size(); 
} 

@Override 
public Object getItem(int position) { 
//this is never called 
    Log.i("David", "returning item "+position); 
    return fotos.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if (convertView == null) { 
     //This returns 0 always 
     Log.i("David", "returning position "+position); 
     int bmWidth=fotos.get(position).getFoto().getWidth(); 
     int bmHeight=fotos.get(position).getFoto().getHeight(); 
     int ivWidth; 
     int ivHeigth; 
     int new_width; 
     int new_height; 
     convertView=inflater.inflate(R.layout.foto_layout, null); 
     holder=new ViewHolder(); 
     holder.lat=(TextView)convertView.findViewById(R.id.textlat); 
     holder.lon=(TextView)convertView.findViewById(R.id.textlon); 
     holder.foto=(ImageView)convertView.findViewById(R.id.foto); 
     ivWidth=dpToPx(80); 
     ivHeigth=dpToPx(80); 
     new_width=ivWidth; 
     new_height = (int) Math.floor((double) bmHeight *((double) new_width/(double) bmWidth)); 
     Bitmap newbitMap = Bitmap.createScaledBitmap(fotos.get(position).getFoto(), new_width, new_height, true); 
     holder.lat.setText(fotos.get(position).getLatitud().toString()); 
     holder.lon.setText(fotos.get(position).getLongitud().toString()); 

     holder.foto.setImageBitmap(newbitMap); 
     convertView.setTag(holder); 
    }else{ 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    return convertView; 
} 

private int dpToPx(int dp) 
{ 
    float density = c.getResources().getDisplayMetrics().density; 
    return Math.round((float)dp * density); 
} 
static class ViewHolder { 
    public TextView lat; 
    public TextView lon; 
    public ImageView foto; 
} 
} 

如果我設置了一個調試點,照片被拍攝,我可以看到我拍攝的不同照片,但是在ListView中顯示的是同一張照片(第一張)。如果我在適配器中設置了調試點,則存儲包含照片的對象的數組具有適當的大小,並且存儲的照片不同...但列表視圖總是顯示相同的照片,儘管它顯示了適當的數量行。

這是怎麼發生的?我該如何解決它?任何幫助?

謝謝。

+0

親愛的,請添加代碼「ivWidth = dpToPx(80); ivHeigth = dpToPx(80) ; new_width = ivWidth; new_height =(int)Math.floor((double)bmHeight *((double)new_width /(double)bmWidth)); 位圖newbitMap = Bitmap.createScaledBitmap(fotos.get(position).getFoto (),new_width,new_height,true); holder.lat.setText(fotos.get(position).getLatitud()。toString()); holder.lon.setText(fotos.get(position).getLongitud()。toString()); holder.foto.setImageBitmap(newbitMap);「在返回視圖之前 –

回答

0
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
ViewHolder holder; 
if (convertView == null) { 
    //This returns 0 always 

    convertView=inflater.inflate(R.layout.foto_layout, null); 
    holder=new ViewHolder(); 
    holder.lat=(TextView)convertView.findViewById(R.id.textlat); 
    holder.lon=(TextView)convertView.findViewById(R.id.textlon); 
    holder.foto=(ImageView)convertView.findViewById(R.id.foto); 

    convertView.setTag(holder); 
}else{ 
    holder = (ViewHolder) convertView.getTag(); 
} 
int bmWidth=fotos.get(position).getFoto().getWidth(); 
int bmHeight=fotos.get(position).getFoto().getHeight(); 
int ivWidth; 
int ivHeigth; 
int new_width; 
int new_height; 
ivWidth=dpToPx(80); 
ivHeigth=dpToPx(80); 
new_width=ivWidth; 
new_height = (int) Math.floor((double) bmHeight *((double) new_width/(double) bmWidth)); 
Bitmap newbitMap = Bitmap.createScaledBitmap(fotos.get(position).getFoto(), new_width, new_height, true); 
holder.lat.setText(fotos.get(position).getLatitud().toString()); 
holder.lon.setText(fotos.get(position).getLongitud().toString()); 
holder.foto.setImageBitmap(newbitMap); 

return convertView; 
} 
+0

謝謝你非常喜歡! – Fustigador

+0

這是np,很高興我能幫上忙。 –

1

嘗試把列表的下面的代碼,如果其他條件外,從如果塊,

int bmWidth=fotos.get(position).getFoto().getWidth(); 
    int bmHeight=fotos.get(position).getFoto().getHeight(); 
    ivWidth=dpToPx(80); 
    ivHeigth=dpToPx(80); 
    new_width=ivWidth; 
    new_height = (int) Math.floor((double) bmHeight *((double) new_width/(double) bmWidth)); 
    Bitmap newbitMap =Bitmap.createScaledBitmap(fotos.get(position).getFoto(), new_width, new_height, true); 
    holder.lat.setText(fotos.get(position).getLatitud().toString()); 
    holder.lon.setText(fotos.get(position).getLongitud().toString()); 

    holder.foto.setImageBitmap(newbitMap); 
+0

你比較快,但是haint的回答比較完整,所以即時接受他的。謝謝! – Fustigador

+0

當然不是問題... :-) –