2014-10-15 8 views
1

Тестирование этого класса для проблем памяти с использованием MAT я понял, что там 16 объектов внутреннего класса ViewHolder в соответствии с инструментом, но я действительно не понимаю, где проблема. Может ли кто-нибудь мне помочь, пожалуйста?listview viewHolder утечки памяти android

public class InEnglishPlacesDataListCursorAdapter extends SimpleCursorAdapter implements OnClickListener{ 

    private ListPlacesFragment activity; 
    private SearchPlaceResultListFragment searchPlaceResultListFragment; 
    private BitmapTask imgFetcher; 
    private Context context; 
    private int layout; 
    private Cursor cursor; 
    private double current_latitude; 
    private double current_longtitude; 
    private String button_pressed; 
    private Boolean imagessavedFlag; 
    private Bitmap bitmap; 
    private String fontcolor=""; 
    private Bitmap bit; 

    GPSTracker gps; 
    ArrayList<PlacesData> placesDataArray = new ArrayList<PlacesData>(); 


    public InEnglishPlacesDataListCursorAdapter(String button_pressed, SearchPlaceResultListFragment searchPlaceResultListFragment, Context context, int layout, Cursor cursor, String[] from, int[] to, double current_latitude, double current_longtitude, boolean imagessavedFlag, String fontcolor) { 
     super(context, layout, cursor, from, to); 
     this.button_pressed = button_pressed; 
     this.searchPlaceResultListFragment = searchPlaceResultListFragment; 
     this.context = context.getApplicationContext(); 
     this.layout = layout; 
     this.cursor = cursor; 
     //this.imgFetcher = i; 
     this.current_latitude = current_latitude; 
     this.current_longtitude = current_longtitude; 
     this.imagessavedFlag = imagessavedFlag; 
     this.fontcolor = fontcolor; 
     // TODO Auto-generated constructor stub 
    } 

    public InEnglishPlacesDataListCursorAdapter(String button_pressed, ListPlacesFragment activity, Context context, int layout, Cursor cursor, String[] from, int[] to, double current_latitude, double current_longtitude, boolean imagessavedFlag) { 
     super(context, layout, cursor, from, to); 
     this.button_pressed = button_pressed; 
     this.activity = activity; 
     this.context = context; 
     this.layout = layout; 
     this.cursor = cursor; 
     //this.imgFetcher = i; 
     this.current_latitude = current_latitude; 
     this.current_longtitude = current_longtitude; 
     this.imagessavedFlag = imagessavedFlag; 
     // TODO Auto-generated constructor stub 
    } 

    private class ViewHolder{ 
     TextView nametv, placeNametv, distance, latitudetv, longtitudetv, desc_infohiddentv, menuhiddentv, 
     telhiddentv, linkhiddentv, fbLinkhiddentv, emailhiddentv, exhibitionhiddentv, 
     photoLink1hiddentv, photoLink2hiddentv, photoLink3hiddentv, photoLink4hiddentv; 
     ImageView icon; 
     Button infoButton; 

     ViewHolder(View v){ 
      desc_infohiddentv = (TextView) v.findViewById(R.id.descinfohiddentv); 
      menuhiddentv = (TextView) v.findViewById(R.id.menuhiddentv); 
      telhiddentv = (TextView) v.findViewById(R.id.telhiddentv); 
      linkhiddentv = (TextView) v.findViewById(R.id.linkhiddentv); 
      fbLinkhiddentv = (TextView) v.findViewById(R.id.fbLinkhiddentv); 
      emailhiddentv = (TextView) v.findViewById(R.id.emailhiddentv); 
      exhibitionhiddentv = (TextView) v.findViewById(R.id.exhibitionhiddentv); 
      photoLink1hiddentv = (TextView) v.findViewById(R.id.photoLink1hiddentv); 
      photoLink2hiddentv = (TextView) v.findViewById(R.id.photoLink2hiddentv); 
      photoLink3hiddentv = (TextView) v.findViewById(R.id.photoLink3hiddentv); 
      photoLink4hiddentv = (TextView) v.findViewById(R.id.photoLink4hiddentv); 
      nametv = (TextView) v.findViewById(R.id.locationName); 
      placeNametv = (TextView) v.findViewById(R.id.placeNametv); 
      latitudetv = (TextView) v.findViewById(R.id.latitudetv); 
      longtitudetv = (TextView) v.findViewById(R.id.longtitudetv); 
      distance = (TextView) v.findViewById(R.id.distance); 
      icon = (ImageView) v.findViewById(R.id.locationImage); 
      infoButton = (Button) v.findViewById(R.id.info_button); 
     } 
    } 



    public View getView(int pos, View inView, ViewGroup parent){ 
     ConnectivityManager cm = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo ni = cm.getActiveNetworkInfo(); 
     //imgFetcher = new BitmapTask(context.getApplicationContext()); 
     View v = inView; 
     ViewHolder viewHolder = null; 
     if (v == null) { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = inflater.inflate(R.layout.places_basic_layout, parent, false); 
      viewHolder = new ViewHolder(v); 
      viewHolder.infoButton.setTag(viewHolder); 
      v.setTag(viewHolder); 
     } 
     else{ 
      viewHolder = (ViewHolder) v.getTag(); 
     } 
     this.cursor.moveToPosition(pos); 
     String name = this.cursor.getString(this.cursor.getColumnIndex("_id")); 
     int integer_id = Integer.parseInt(name); 
     String placeNameEl = this.cursor.getString(this.cursor.getColumnIndex("name_en")); 
     String image_link = this.cursor.getString(this.cursor.getColumnIndex("photo_link")); 
     double place_latitude = this.cursor.getDouble(this.cursor.getColumnIndex("latitude")); 
     String str_placelatitude = Double.toString(place_latitude); 
     double place_longtitude = this.cursor.getDouble(this.cursor.getColumnIndex("longtitude")); 
     String str_placelongtitude = Double.toString(place_longtitude); 
     String descInfo = this.cursor.getString(this.cursor.getColumnIndex("info_en")); 
     String tel = this.cursor.getString(this.cursor.getColumnIndex("tel")); 
     String link = this.cursor.getString(this.cursor.getColumnIndex("link")); 
     String fbLink = this.cursor.getString(this.cursor.getColumnIndex("fb_link")); 
     String email = this.cursor.getString(this.cursor.getColumnIndex("email")); 
     String exhibition = this.cursor.getString(this.cursor.getColumnIndex("exhibition_en")); 
     String menu = this.cursor.getString(this.cursor.getColumnIndex("menu_en")); 
     String link1 = this.cursor.getString(this.cursor.getColumnIndex("link1")); 
     String link2 = this.cursor.getString(this.cursor.getColumnIndex("link2")); 
     String link3 = this.cursor.getString(this.cursor.getColumnIndex("link3")); 
     String link4 = this.cursor.getString(this.cursor.getColumnIndex("link4")); 


     double apostasi = GPSTracker.getDistance(this.current_latitude, this.current_longtitude, place_latitude, place_longtitude); 
     double distanceInKm = apostasi/1000; 
     DecimalFormat df = new DecimalFormat("#.##"); 
     String dx=df.format(distanceInKm); 


     viewHolder.nametv.setText(name); 
     viewHolder.desc_infohiddentv.setText(descInfo); 
     viewHolder.menuhiddentv.setText(menu); 
     viewHolder.telhiddentv.setText(tel); 
     viewHolder.linkhiddentv.setText(link); 
     viewHolder.fbLinkhiddentv.setText(fbLink); 
     viewHolder.emailhiddentv.setText(email); 
     viewHolder.exhibitionhiddentv.setText(exhibition); 
     viewHolder.photoLink1hiddentv.setText(link1); 
     viewHolder.photoLink2hiddentv.setText(link2); 
     viewHolder.photoLink3hiddentv.setText(link3); 
     viewHolder.photoLink4hiddentv.setText(link4); 
     viewHolder.placeNametv.setText(placeNameEl); 
     if (fontcolor.equals("black")){ 
      viewHolder.placeNametv.setText(placeNameEl); 
      viewHolder.distance.setText(dx + " km"); 
      viewHolder.distance.setTextColor(Color.BLACK); 
      viewHolder.distance.setTypeface(null, Typeface.BOLD); 
      viewHolder.placeNametv.setTextColor(Color.BLACK); 
      viewHolder.placeNametv.setTypeface(null, Typeface.BOLD); 
     } 
     else{ 
      viewHolder.placeNametv.setText(placeNameEl); 
      viewHolder.distance.setText(dx + " km"); 
     } 
     //viewHolder.surnametv.setTag(surname); 
     viewHolder.latitudetv.setText(str_placelatitude); 
     viewHolder.longtitudetv.setText(str_placelongtitude); 
     viewHolder.infoButton.setOnClickListener(this); 

     return v; 
    } 
    ![][1] 
    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     //TextView surnametv = (TextView) v.findViewById(R.id.nameEl); 
     //Button pressed = (Button) v; 
     //String button_pressed_text = pressed.getText().toString(); 
     Log.i("Button pressed text =>", " " + button_pressed); 

     ViewHolder vH = (ViewHolder) v.getTag(); 
     //String url = (String) vH.surnametv.getTag(); 
     //Toast.makeText(this.context, url, Toast.LENGTH_SHORT).show(); 
     Intent intent = new Intent(context.getApplicationContext(), PlacesDetailsTabs.class); 
     //Intent intent = new Intent(this.activity, PlacesListFragmentActivityTest.class); 
     //intent.putExtra("nameEl", vH.surnametv.getTag().toString()); 
     String str_current_latitude = Double.toString(current_latitude); 
     String str_current_longtitude = Double.toString(current_longtitude); 
     intent.putExtra("language", "English"); 
     intent.putExtra("current latitude" , str_current_latitude); 
     intent.putExtra("current longtitude", str_current_longtitude); 
     intent.putExtra("placeNameEl", vH.placeNametv.getText()); 
     intent.putExtra("desc_info", vH.desc_infohiddentv.getText()); 
     intent.putExtra("menu", vH.menuhiddentv.getText()); 
     intent.putExtra("telephone", vH.telhiddentv.getText()); 
     intent.putExtra("link", vH.linkhiddentv.getText()); 
     intent.putExtra("fbLink", vH.fbLinkhiddentv.getText()); 
     intent.putExtra("email", vH.emailhiddentv.getText()); 
     intent.putExtra("exhibition", vH.exhibitionhiddentv.getText()); 
     intent.putExtra("photoLink1", vH.photoLink1hiddentv.getText()); 
     intent.putExtra("photoLink2", vH.photoLink2hiddentv.getText()); 
     intent.putExtra("photoLink3", vH.photoLink3hiddentv.getText()); 
     intent.putExtra("photoLink4", vH.photoLink4hiddentv.getText()); 
     intent.putExtra("latitude", vH.latitudetv.getText()); 
     intent.putExtra("longtitude", vH.longtitudetv.getText()); 
     intent.putExtra("button_pressed_text", button_pressed); 
     intent.putExtra("displaycurrentPoint", "yes"); 
     //Toast.makeText(this.context, vH.photoLink1hiddentv.getText(), Toast.LENGTH_SHORT).show(); 
     //intent.putExtra("latitude", this.c.getDouble(this.c.getColumnIndex("latitude"))); 
     //intent.putExtra("longtitude", this.c.getDouble(this.c.getColumnIndex("longtitude"))); 
     if (this.activity == null){ 
      this.searchPlaceResultListFragment.startActivity(intent); 
     }else{ 
      this.activity.startActivity(intent); 
     } 
    } 



} 
+0

адаптер находится внутри класса ListPlacesFragment, который проходит ListFragment и следующую команду: setListAdapter (новый InEnglishPlacesDataListCursorAdapter (button_pressed, это, getActivity(), R.layout.places_basic_layout, курсор, столбцы, чтобы, current_latitude, current_longtitude, imagessavedFlag)) ; называет это. – tsiro

+0

Я думаю, что я понял, где проблема ... Я переместил класс ViewHolder из класса адаптера в класс ListFragment ... экземпляры ViewHolder теперь 1 ... спасибо вам, ребята, за вашу помощь ... – tsiro

+1

Почему вы считаете, что наличие 16 экземпляров ViewHolder является проблемой? –

ответ

1

сделать класс ViewHolder статическим внутренним классом.

Просто добавьте

static class ViewHolder{} 

Это избежать образования множественного объектный viewHolder.

Следуйте этому учебник, поможет вам понять, представление списка лучше https://www.youtube.com/watch?v=wDBM6wVEO70

+0

У меня есть попытка попробовать, но количество объектов остается 16. – tsiro

+0

ViewHolder viewHolder = null; считать его переменной экземпляра –

+0

Что мне нужно изменить в моем коде? – tsiro

0

Существует много вещей, которые вы должны увидеть.

Прежде всего, вы должны знать, что функция getView вызывается каждый раз, когда вы прокручиваете список или каждый вводимый вами элемент. Итак, трещины в моей точке зрения заключаются в том, что ваша функция getView должна быть аккуратной и чистой. Значит, это просто показывает значение, чтобы не заполнить его внутри getView.

Меры предосторожности:

1) Проверьте подключение вне адаптера.

2) Создайте статический класс viewHolder, чтобы он был создан один раз.

3) вы должны заполнить ArrayList объектов вне getView, а затем использовать этот список внутри getView.

+1

«Создайте статический класс viewHolder, чтобы он был создан один раз». Что ты хочешь этим сказать? Что будет создано только один раз? –

+0

Как я помню, статические переменные создаются во время компиляции, а не время запуска, так что он не может быть создан во время выполнения – Beyaz

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