2015-06-28 3 views
0

Я сделал собственный макет для просмотра списка. Макет имеет 2 текстовых вида, одну кнопку и один вид изображения. Когда я раздуваю макет в своем списке, он отлично работает, но когда я прокручиваю вверх и вниз по списку, я проверяю свой лог-кошку и обнаруживаю, что происходит утечка памяти, я не знаю, в чем проблема:Android: просмотр пользовательского списка Утечка памяти

вот LogCat:

06-27 20: 37: 29,321 D/dalvikvm (9034): GC_CONCURRENT освободил 1749K, 16% бесплатно 15831K/18723K, приостановлена ​​1 мс + 10 мс

06-27 20:37 : 32,451 D/dalvikvm (9034): GC_CONCURRENT освободил 175K, 7% бесплатно 20124K/21475K, остановился 2ms + 18мс

06-27 20: 37: 35,591: D/dalvikvm (9034): GC_CONCURRENT освободил 45K, 5 % бесплатно 25948K/27171K, pau SED 2мс + 12ms

мой код:

l = (ListView) findViewById(R.id.listView1); 
    CustomAdapter adapter = new CustomAdapter(this,songs); 
    l.setAdapter(adapter); 

CustomAdapter класс:

class CustomAdapter extends ArrayAdapter<String> 
{ 
    Context c; 
    LayoutInflater li; 
    List<String> names = new ArrayList<String>(); 
    ImageView i; 
    TextView t1,t2; 
    Button b; 

    public CustomAdapter(Context context, List<String> resource) 
    { 
     super(context,R.id.textView1, resource); 
     c = context; 
     names = resource;   
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     li = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
     convertView = li.inflate(R.layout.layout_listview, null); 

     i = (ImageView) convertView.findViewById(R.id.imageView1); 
     t1 = (TextView) convertView.findViewById(R.id.textView1); 
     t2 = (TextView) convertView.findViewById(R.id.textView2); 
     b = (Button) convertView.findViewById(R.id.button1); 

     t1.setText(songs.get(position)); 
     t2.setText(songs.get(position)); 

     b.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View arg0) 
      { 

      } 
     }); 

     return convertView; 
    } 

} 

Я заменил код выше с этим, но проблема все та же.

public View getView(int position, View convertView, ViewGroup parent) 
    { 
     pos = position; 
     Log.i("in getView",Integer.toString(pos)); 
     //li = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
     li = LayoutInflater.from(getContext()); 
     View customView = li.inflate(R.layout.layout_listview, parent,false); 

     i = (ImageView) customView.findViewById(R.id.imageView_filter); 
     t1 = (TextView) customView.findViewById(R.id.textView1); 
     t2 = (TextView) customView.findViewById(R.id.textView2); 
     LinearLayout linearonclick = (LinearLayout) customView.findViewById(R.id.LinearlayoutOnClickListView); 
     b = (Button) customView.findViewById(R.id.button_eq); 

     t1.setText(names.get(position)); 
     t2.setText(names.get(position)); 

     linearonclick.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       Log.i("in on Click",Integer.toString(pos)); 
       Toast.makeText(getContext(),songs.get(pos), Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     b.setOnClickListener(new OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       Toast.makeText(getContext(), "You selected modd Button", Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     return customView; 
    } 
+0

Посмотрите на http://stackoverflow.com/questions/11387269/listview-gets-out-of-memory-exception-but-with-no-memory-leaks – ditkin

ответ

0

В методе getView вы хотите раздуть новый конвертер, если он не равен нулю. Сначала проверьте, чтобы он не был нулевым, и если он правильный, тогда используйте его.

От Adapter getView documentation:

convertView: старый вид для повторного использования, если это возможно. Примечание. Вы должны проверить , что перед просмотром это представление не является нулевым и соответствующего типа. Если невозможно преобразовать это представление, чтобы отобразить правильные данные, этот метод может создать новый вид. Гетерогенные списки могут указывать их количество видов, поэтому этот вид всегда имеет значение (см. GetViewTypeCount() и getItemViewType (int)).

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