2015-07-10 9 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)); 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()); .jpg –

ответ

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

, конечно, не проблема ... :-) –

Смежные вопросы