mercredi 20 mai 2015

Android ImageView in ListView slow loading

I have issues concerning my listView which is containing an imageView, textview and a button. The layout looks fine but my problem is that when I load the listView using my adapter, I try to download each of these images using Picasso library and then put it into my view. And I got a lot of memory consuption, heap about 120Mb and the images won't load. Here is my code:

ListItemLayout:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://ift.tt/nIICcg"
android:id="@+id/FrameLayout1"
android:layout_width="fill_parent"
android:layout_height="300dp" >

<ImageView
    android:id="@+id/StatusImage"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<LinearLayout
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_gravity="bottom"
    android:orientation="vertical"
    android:background="@drawable/gradient" >

    <TextView
        android:id="@+id/StatusText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some text" />

    <!--Button
        android:id="@+id/likeButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:text="Like" /-->

</LinearLayout>
</ImageView>

The adapter:

public class MySimpleArrayAdapter extends ArrayAdapter<String> {
private final Context context;
private final String[] values;

public MySimpleArrayAdapter(Context context, String[] values) {
    super(context, R.layout.simple_list_item, values);
    this.context = context;
    this.values = values;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    int distance = 0;
    if (MainActivity.lat2 != null && MainActivity.lon2 != null) {
        distance = (int) computeDistanceBetween(new LatLng(MainActivity.lat, MainActivity.lon), new LatLng(MainActivity.lat2[position], MainActivity.lon2[position]));
    }
    View rowView = inflater.inflate(R.layout.simple_list_item, parent, false);
    TextView firsteLine = (TextView) rowView.findViewById(R.id.StatusText);
    ImageView imageView = (ImageView) rowView.findViewById(R.id.StatusImage);
    if (MainActivity.imgLink != null) {
        Picasso.with(context).load("MyPage" + MainActivity.imgLink[position]).resize(imageView.getMaxWidth(),imageView.getMaxHeight()).centerCrop().into(imageView);
    }
    if (distance > 1000) {
        distance = distance / 1000;
        firsteLine.setText(values[position] + " ( " + String.valueOf(distance) + "km) ");
    } else {
        firsteLine.setText(values[position] + " ( " + String.valueOf(distance) + "m) ");
    }
    return rowView;
}

And here is the ListFragment:

public class MyListFragment extends ListFragment {
static ArrayAdapter<String> adapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    adapter = new MySimpleArrayAdapter(getActivity(), MainActivity.text1);
    setListAdapter(adapter);
    }

@Override
public void onResume()
{
    super.onResume();
    //do the data changes. In this case, I am refreshing the arrayList cart_list and then calling the listview to refresh.
    adapter = new MySimpleArrayAdapter(getActivity(), MainActivity.text1);
    Log.d("Tag", "this is what i want");
    setListAdapter(adapter);
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Log.d("Tag","OnViewCreated called");
}


@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
}

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    String author = null;
    String link = null;
    String text3 = null;
    int distance = 0;
    int ts = 0;
    LatLng ll = new LatLng(MainActivity.lat, MainActivity.lon);
    author = MainActivity.users[position];
    link = MainActivity.imgLink[position];
    text3 = MainActivity.text1[position];
    distance = (int) computeDistanceBetween(ll, new LatLng(MainActivity.lat2[position], MainActivity.lon2[position]));
    ts = MainActivity.time[position];
    Intent intent = new Intent(getActivity(), ShowMarkerContent.class);
    intent.putExtra("link", link);
    intent.putExtra("author", author);
    intent.putExtra("text", text3);
    intent.putExtra("distance", distance);
    intent.putExtra("time", ts);
    startActivity(intent);
}

Aucun commentaire:

Enregistrer un commentaire