我使用ArrayAdapter创建listView。每个项目都有很多观点。这是getView()方法的代码:
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.dialog_list_view, null);
holder = new ViewHolder();
holder.date = (TextView)convertView.findViewById(R.id.date);
holder.multi_chat = (ImageView)convertView.findViewById(R.id.multi_chat);
holder.my_userpick = (ImageView)convertView.findViewById(R.id.my_userpic);
holder.name = (TextView)convertView.findViewById(R.id.name);
holder.photo1 = (ImageView)convertView.findViewById(R.id.photo1);
holder.photo2 = (ImageView)convertView.findViewById(R.id.photo2);
holder.photo31 = (ImageView)convertView.findViewById(R.id.photo31);
holder.photo32 = (ImageView)convertView.findViewById(R.id.photo32);
holder.photo33 = (ImageView)convertView.findViewById(R.id.photo33);
holder.photo41 = (ImageView)convertView.findViewById(R.id.photo41);
holder.photo42 = (ImageView)convertView.findViewById(R.id.photo42);
holder.photo43 = (ImageView)convertView.findViewById(R.id.photo43);
holder.photo44 = (ImageView)convertView.findViewById(R.id.photo44);
holder.text = (TextView)convertView.findViewById(R.id.text);
holder.userpic = (ImageView)convertView.findViewById(R.id.userpic);
holder.userpick2 = convertView.findViewById(R.id.userpick2);
holder.userpick3 = convertView.findViewById(R.id.userpick3);
holder.userpick4 = convertView.findViewById(R.id.userpick4);
holder.wrapper = (RelativeLayout)convertView.findViewById(R.id.wrapper);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (dialogs != null) {
if (position == (this.getCount() - 1)) {
if (dialogs != null) {
if (dates.size() > 1) {
dialogs.getDialogs(dates.size()+20);
}
}
}
}
if (dates.get(position).getChatId() != 0) {
holder.name.setText(dates.get(position).getTitle());
holder.multi_chat.setVisibility(View.VISIBLE);
} else {
holder.name.setText(dates.get(position).getUidDates());
holder.multi_chat.setVisibility(View.GONE);
}
if (dates.get(position).getReadState() == 0) {
holder.wrapper.setBackgroundColor(getResources().getColor(R.color.conversation_list_no_read));
} else {
holder.wrapper.setBackgroundColor(android.R.color.white);
}
holder.text.setText(dates.get(position).getBody());
int date = dates.get(position).getDate();
java.util.Date time = new java.util.Date((long) date * 1000);
if ((time.getDate() == current_date.getDate()) && (time.getMonth() == current_date.getMonth()) && (time.getYear() == current_date.getYear())) {
holder.date.setText(time.getHours() + ":" + time.getMinutes());
} else if ((time.getDate() == (current_date.getDate() - 1)) && (time.getMonth() == current_date.getMonth()) && (time.getYear() == current_date.getYear())) {
holder.date.setText("вчера");
} else {
holder.date.setText(time.getDate() + "." + time.getMonth() + "." + (time.getYear()+1900));
}
if(!dates.get(position).getPhotoInText().equals("")) {
loaderWithoutCut.displayImage(dates.get(position).getPhotoInText(), holder.my_userpick, false);
holder.my_userpick.setVisibility(View.VISIBLE);
holder.text.setBackgroundDrawable(getResources().getDrawable(R.drawable.dialog_rect_bg));
holder.text.setPadding(10, 0, 10, 0);
holder.text.setGravity(Gravity.CENTER_VERTICAL);
holder.text.setSingleLine(true);
holder.text.setEllipsize(TextUtils.TruncateAt.END);
} else {
holder.my_userpick.setVisibility(View.GONE);
holder.text.setBackgroundColor(getResources().getColor(android.R.color.transparent));
holder.text.setPadding(0, 0, 0, 0);
holder.text.setSingleLine(false);
holder.text.setGravity(Gravity.TOP);
}
ArrayList photos = dates.get(position).getUidPhotos();
if (dates.get(position).getChatId() == 0) {
if (photos.size() == 1) {
loaderWithoutCut.displayImage((String) photos.get(0), holder.userpic, false);
holder.userpick2.setVisibility(View.GONE);
holder.userpick3.setVisibility(View.GONE);
holder.userpick4.setVisibility(View.GONE);
holder.userpic.setVisibility(View.VISIBLE);
}
} else {
if ((photos.size() < 3) && (photos.size()>0)) {
if (photos.size() == 1) {
holder.photo1.setVisibility(View.GONE);
loaderWithCut.displayImage((String) photos.get(0), holder.photo2, true);
} else {
holder.photo1.setVisibility(View.VISIBLE);
loaderWithCut.displayImage((String) photos.get(1), holder.photo2, true);
if (!((String) photos.get(1)).equals((String) photos.get(0))) {
loaderWithCut.displayImage((String) photos.get(0), holder.photo1, true);
} else {
holder.photo1.setVisibility(View.GONE);
}
}
holder.userpic.setVisibility(View.GONE);
holder.userpick2.setVisibility(View.VISIBLE);
holder.userpick3.setVisibility(View.GONE);
holder.userpick4.setVisibility(View.GONE);
}
if (photos.size() == 3) {
loaderWithCut.displayImage((String) photos.get(0), holder.photo31, true);
loaderWithoutCut.displayImage((String) photos.get(1), holder.photo32, false);
loaderWithoutCut.displayImage((String) photos.get(2), (ImageView) holder.photo33, false);
holder.userpic.setVisibility(View.GONE);
holder.userpick2.setVisibility(View.GONE);
holder.userpick3.setVisibility(View.VISIBLE);
holder.userpick4.setVisibility(View.GONE);
}
if (photos.size() >= 4) {
loaderWithoutCut.displayImage((String) photos.get(0), holder.photo41, false);
loaderWithoutCut.displayImage((String) photos.get(1), holder.photo42, false);
loaderWithoutCut.displayImage((String) photos.get(2), holder.photo43, false);
loaderWithoutCut.displayImage((String) photos.get(3), holder.photo44, false);
holder.userpic.setVisibility(View.GONE);
holder.userpick2.setVisibility(View.GONE);
holder.userpick3.setVisibility(View.GONE);
holder.userpick4.setVisibility(View.VISIBLE);
}
}
if (photos.size() == 0) {
holder.userpick2.setVisibility(View.GONE);
holder.userpick3.setVisibility(View.GONE);
holder.userpick4.setVisibility(View.GONE);
}
final ViewHolder holder2 = holder;
convertView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
TextView text = holder2.text;
TextView date = holder2.date;
TextView name = holder2.name;
if (hasFocus) {
text.setTextColor(getResources().getColor(android.R.color.white));
date.setTextColor(getResources().getColor(android.R.color.white));
name.setTextColor(getResources().getColor(android.R.color.white));
} else {
text.setTextColor(getResources().getColor(R.color.dialog_text));
date.setTextColor(getResources().getColor(R.color.dialog_date));
name.setTextColor(getResources().getColor(R.color.friends_text_color));
}
}
});
return convertView;
}
问题是 - 列表视图滚动工作非常慢。我怎么能解决这个问题? 布局代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical" android:background="@drawable/list_drawable_settings">
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical" android:id="@+id/wrapper">
<LinearLayout android:layout_width="52dip" android:id="@+id/images" android:layout_margin="6dip"
android:layout_height="58dip">
<com.vk.messenger.views.RoundedConersImageView android:id="@+id/userpic"
android:layout_height="wrap_content" android:layout_width="wrap_content"
/>
<LinearLayout android:layout_width="wrap_content" android:id="@+id/userpick2"
android:layout_height="wrap_content">
<LinearLayout android:layout_width="26dip"
android:layout_height="58dip">
<com.vk.messenger.views.ScalledImageView android:scaleType="fitCenter"
android:cropToPadding="true" android:layout_width="26dip"
android:layout_height="58dip"
android:id="@+id/photo1"/>
</LinearLayout>
<LinearLayout android:layout_width="26dip"
android:layout_height="58dip">
<com.vk.messenger.views.ScalledImageView android:layout_width="26dip"
android:layout_height="58dip" android:scaleType="fitCenter"
android:cropToPadding="true"
android:id="@+id/photo2"/>
</LinearLayout>
</LinearLayout>
<LinearLayout android:layout_width="wrap_content" android:id="@+id/userpick3"
android:layout_height="wrap_content">
<ImageView android:layout_width="26dip" android:layout_height="58dip" android:id="@+id/photo31"
></ImageView>
<LinearLayout android:layout_width="26dip" android:id="@+id/userpick3"
android:layout_height="58dip"
android:orientation="vertical">
<ImageView android:layout_width="26dip"
android:scaleType="fitCenter" android:cropToPadding="true"
android:layout_height="26dip" android:id="@+id/photo32"
></ImageView>
<ImageView android:layout_width="26dip"
android:scaleType="fitCenter" android:cropToPadding="true"
android:layout_height="29dip" android:id="@+id/photo33"
></ImageView>
</LinearLayout>
</LinearLayout>
<LinearLayout android:layout_width="52dip" android:id="@+id/userpick4"
android:layout_height="58dip" android:orientation="horizontal">
<LinearLayout android:layout_width="26dip"
android:layout_height="58dip"
android:orientation="vertical">
<ImageView android:layout_width="26dip"
android:layout_height="29dip" android:id="@+id/photo41"
></ImageView>
<ImageView android:layout_width="26dip"
android:layout_height="29dip" android:id="@+id/photo42"
></ImageView>
</LinearLayout>
<LinearLayout android:layout_width="26dip"
android:layout_height="58dip"
android:orientation="vertical">
<ImageView android:layout_width="26dip"
android:layout_height="29dip" android:id="@+id/photo43"
></ImageView>
<ImageView android:layout_width="26dip"
android:layout_height="29dip" android:id="@+id/photo44"
></ImageView>
</LinearLayout>
</LinearLayout>
</LinearLayout>
<RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/images" android:layout_marginLeft="4dip">
<LinearLayout android:layout_width="fill_parent" android:orientation="vertical" android:id="@+id/left" android:layout_height="wrap_content">
<LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content">
<ImageView android:id="@+id/multi_chat" android:visibility="invisible" android:paddingTop="3dip" android:paddingRight="2dip"
android:src="@drawable/multi_chat"
android:layout_height="wrap_content" android:layout_width="wrap_content"
/>
<com.vk.messenger.views.TextViewMyriadPro android:id="@+id/name" android:text="" android:singleLine="true" android:ellipsize="end"
android:layout_centerVertical="true"
android:textColor="@color/friends_text_color" android:textSize="16dip" android:textStyle="bold"
android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_weight="1"/>
<com.vk.messenger.views.TextViewHelvetica android:id="@+id/date" android:layout_marginLeft="6dip" android:gravity="right" android:layout_marginRight="6dip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/dialog_date"
android:textSize="13dip"/>
</LinearLayout>
<LinearLayout android:layout_height="wrap_content"
android:layout_width="fill_parent" android:layout_weight="1" android:layout_marginTop="2dip">
<com.vk.messenger.views.RoundedConersImageView android:id="@+id/my_userpic" android:visibility="gone" android:paddingRight="2dip"
android:layout_height="30dip" android:layout_width="30dip"/>
<com.vk.messenger.views.TextViewHelvetica android:id="@+id/text" android:text="текст" android:layout_below="@id/name"
android:layout_centerVertical="true" android:layout_marginLeft="3dip" android:layout_marginRight="6dip"
android:textColor="@color/dialog_text" android:textSize="13dip"
android:layout_height="fill_parent"
android:layout_width="fill_parent" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
</RelativeLayout>
</LinearLayout>
答案 0 :(得分:0)
我认为你只是在getview中做了太多,每次尝试滚动时,所有代码都必须为每个可见的列表项运行,发生的事情太多了。
那些loadWithCut / loadWitoutCut也是什么?你从哪里加载图像?你在getview中操纵图像吗?
如果可能的话,我会首先尝试将任何对象创建移出getView,然后在各种方法中进行一些记录,以查看发生缓慢的位置。
答案 1 :(得分:0)
我会考虑摆脱你的嵌套LinearLayouts
。您应该使用RelativeLayout
,而不是嵌套LinearLayouts
;特别是如果你正在嵌套LinearLayouts
。由于您使用的是如此多的图像,因此您可能需要考虑重新构建布局。这篇文章讨论了如何以及为什么:
http://android-developers.blogspot.com/2009/02/android-layout-tricks-1.html
你也可以考虑分解你的getView
方法,那里有很多事情要做。 getView
必须为每次调用执行大部分代码,可能会导致问题。你应该考虑创建另一个类。