Вы создаете каждый элемент View
для своего списка динамически каждый раз, когда вы открываете представление.Это, возможно, самый неэффективный механизм за всю историю:).
В качестве первого шага, посмотрите, можете ли вы расположить ваше представление в XML.Упрощает управление.
Даже если вы этого не делаете, используйте параметр convertView
.Его единственная причина существования заключается в том, чтобы удерживать вас от необходимости перераспределять взгляды, если это возможно.Если convertView
не равно NULL, он имеет все представления, которые вы создали в предыдущем вызове getView()
.Все, что вам нужно сделать, это заполнить соответствующую информацию в каждом представлении (по сути, в вашем случае, setText()
звонки).Если convertView
равно нулю, создайте свои представления.
Кроме того, не invalidate()
.Как минимум, без макета XML, вот переписанная версия, которая должна быть немного быстрее.
@Override
public View getView(int position, View convertView, ViewGroup grp) {
if(convertView == null) {
LinearLayout lin = new LinearLayout(this.getContext());
lin.setOrientation(LinearLayout.HORIZONTAL);
// Icon
ImageView v = new ImageView(this.getContext());
// v.setBackgroundDrawable(iF.getResources().getDrawable(R.drawable.cube_icon));
// Text
TextView txt = new TextView(this.getContext());
txt.setId(1);
txt.setTextSize(Float.valueOf(prefs.getString("pref_txtSize", "12")));
txt.setPadding(10, 10, 10, 10);
txt.setTextColor(getLineColor(position));
// Shortcut
LinearLayout shortLin = new LinearLayout(this.getContext());
shortLin.setGravity(Gravity.RIGHT);
LayoutParams par = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
shortLin.setLayoutParams(par);
TextView s = new TextView(this.getContext());
s.setId(2);
s.setTextSize(Float.valueOf(prefs.getString("pref_txtSize", "12")));
s.setWidth(iF.getResources().getDimensionPixelSize(R.dimen.shortcutWidth));
s.setPadding(10, 10, 10, 10);
shortLin.addView(s);
lin.addView(v);
lin.addView(txt);
lin.addView(shortLin);
}
TextView txt = (TextView)convertView.findViewById(1);
txt.setText(this.getItem(position));
TextView txt = (TextView)convertView.findViewById(2);
txt.setText(getShortcut(position));
return lin;
}
Опять же, не самый лучший способ или лучшая практика, но это должно сработать.