我目前正在处理一个ListView
,其中包含大约80到100个项目(TextViews
)。我认为它不是太多内容,但是当我滚动(用手指)时,ListView
正在浮动或晃动。但是,当我使用“快速滚动按钮” - ListView
右侧的那个东西时 - 滚动显得非常一致和平滑。
有没有人有同样的问题?我在HTC Sensation上测试了ListView
。
这是我的ListView代码:
<ListView
android:id="@+id/list_view"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:scrollingCache="true">
</ListView>
Java代码:
adptr = new ArrayAdapter<String>(iF, R.layout.list_item, showing) {
@Override
public View getView(int position, View convertView, ViewGroup grp) {
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.setTextSize(Float.valueOf(prefs.getString("pref_txtSize", "12")));
txt.setPadding(10, 10, 10, 10);
txt.setText(this.getItem(position));
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.setTextSize(Float.valueOf(prefs.getString("pref_txtSize", "12")));
s.setWidth(iF.getResources().getDimensionPixelSize(R.dimen.shortcutWidth));
s.setPadding(10, 10, 10, 10);
s.setText(getShortcut(position));
shortLin.addView(s);
// Return
txt.invalidate();
v.invalidate();
s.invalidate();
lin.addView(v);
lin.addView(txt);
lin.addView(shortLin);
return lin;
}
};
如您所见,我制作了自定义ListView
。 ArrayAdapter
将以不同的方式添加(此处未显示)。
提前致谢
阿德里安
答案 0 :(得分:4)
你还记得缓存吗?
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
ViewHolder holder;
if (view == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater
.inflate(R.layout.list_view_home_item, parent, false);
holder = new ViewHolder();
holder.title = (TextView) view
.findViewById(R.id.textView);
holder.title.setText("blah");
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
return view;
和
static class ViewHolder {
TextView title;
}
答案 1 :(得分:2)
每次拉取视图时,都会动态地为列表创建每个View
元素。这可能是有史以来效率最低的机制:)。
首先,看看您是否可以用XML布局视图。使事情更容易管理。
即使您不这样做,也请使用convertView
参数。它存在的唯一理由是让您不必在可能的情况下重新分配视图。如果convertView
为非null,则它包含您在先前调用getView()
时创建的所有视图。您所要做的就是在每个视图中填写适当的信息(实际上,在您的情况下,setText()
调用)。如果convertView
为null,请创建您的视图。
另外,不要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;
}
同样,不是最佳方式或最佳做法,但这应该有效。
答案 2 :(得分:0)
最后,我提出了这个解决方案:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
ViewHolder holder;
if (view == null) {
LayoutInflater inflater = (LayoutInflater) iF.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.list_item, parent, false);
holder = new ViewHolder();
holder.title = (TextView) view.findViewById(R.id.item_text);
holder.shortcut = (TextView) view.findViewById(R.id.item_short);
holder.title.setId(1);
holder.shortcut.setId(2);
holder.title.setText(getItem((position)));
holder.shortcut.setText(getShortcut(position));
holder.title.setTextSize(Float.valueOf(prefs.getString("pref_txtSize", "12")));
holder.shortcut.setTextSize(Float.valueOf(prefs.getString("prefs_txtSize", "12")));
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
TextView title = (TextView) convertView.findViewById(1);
title.setText(getItem(position));
TextView shortcut = (TextView) convertView.findViewById(2);
shortcut.setText(getShortcut(position));
}
return view;
}
我现在非常高兴它有效。现在是00:33,所以我想我现在就去睡觉了。今天的工作很充足(昨天:)
感谢所有支持