使用MAT测试此类内存问题,我发现根据该工具,内部类ViewHolder中有16个对象,但是我真的不明白问题出在哪里。
有人可以帮我吗?

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);
        }
    }



}

最佳答案

使ViewHolder类成为静态内部类。

只需添加

static class ViewHolder{}


这避免了viewHolder的多个对象形成。

遵循本教程,将帮助您更好地了解列表视图https://www.youtube.com/watch?v=wDBM6wVEO70

关于android - listview viewHolder泄漏内存android,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26388363/

10-12 06:06