我的应用中有很多行,我觉得它们没有尽可能优化; listView滚动在某些设备上不稳定。我玩过相对布局和相同的效果。我发布在最大罪犯的代码下面。
注意,每行都是一个非常复杂的布局,使用自定义Typefaces
。我发布了XML
和adapter
(getView()
)代码:
有人可以看一下,如果我做了一些不良做法,请告诉我吗? (我尝试不要嵌套布局,但有时你必须!)
以下是您在视觉上看到的内容。事实证明我想要的;只是不顺利滚动:
这是XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="4dp"
android:background="@drawable/following_home_selector"
android:orientation="vertical" >
<RelativeLayout
android:id="@+id/rlCommentButtonBar"
android:layout_width="match_parent"
android:layout_height="55dp"
android:background="@drawable/following_header_selector"
android:orientation="horizontal" >
<ImageView
android:id="@+id/labelFeaturedProfilePic"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="12dp"
android:layout_marginRight="10dp"
android:background="#bbb"
android:contentDescription="Profile"
android:src="@drawable/usericon" />
<LinearLayout
android:layout_width="1px"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@+id/llFollowingCommentButton"
android:background="#bbb" >
</LinearLayout>
<LinearLayout
android:id="@+id/llFollowingCommentButton"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="@drawable/review_button_selector"
android:orientation="vertical" >
<TextView
android:id="@+id/tvFollowingCommentLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:padding="3dp"
android:text="comment"
android:textColor="#888" />
<TextView
android:id="@+id/tvFollowingCommentTotal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="-2dp"
android:background="@drawable/ic_comment_gray"
android:gravity="center_horizontal"
android:padding="1dp"
android:text="8"
android:textColor="#fff"
android:textSize="12sp"
android:textStyle="italic" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/labelFeaturedProfilePic"
android:orientation="vertical" >
<TextView
android:id="@+id/myMastCat_Username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Username"
android:textColor="#222"
android:textSize="20sp" />
<TextView
android:id="@+id/myMastCat_Date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Date"
android:textColor="#999"
android:textSize="12sp"
android:textStyle="italic" />
</LinearLayout>
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/following_inner_box_selector"
android:orientation="vertical"
android:padding="7dp" >
<LinearLayout
android:id="@+id/llWatchItemCommentButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/myMasterCat_Item"
style="@style/DropShadowEffect"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="3dp"
android:layout_marginTop="3dp"
android:layout_weight="90"
android:shadowColor="#ffffff"
android:text="Item"
android:textColor="#666"
android:textSize="24sp" />
</LinearLayout>
<TextView
android:id="@+id/myMastCat_Cat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:layout_marginLeft="3dp"
android:layout_marginTop="-3dp"
android:gravity="top"
android:text="MasterCat"
android:textColor="#666"
android:textSize="14sp" />
<TextView
android:id="@+id/myMasterCat_Review"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="3dp"
android:text="This is an item review."
android:textColor="#666"
android:textSize="17sp" />
</LinearLayout>
</LinearLayout>
至于图层/透支:
我的主题背景是#d8d9d9 hex;包含listView
(未显示)的布局文件没有背景。
这是我的ListView(第三方库)
<com.handmark.pulltorefresh.library.PullToRefreshListView
android:id="@+id/pull_to_refresh_scrollview_feat"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:listSelector="#00000000" />
我必须使用00000000
删除默认的蓝色背景,出于某种原因,只有在深灰色背景下出现在按下状态。
您看到的个人资料图片是使用LazyList
库加载的。
另外,请注意我使用的是三个不同的Roboto Typeface
;除了一个textView之外的所有文本都使用自定义TypeFace
。
最后,这是getView()
中的adapter
:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
if (convertView == null) {
convertView = inflater.inflate(R.layout.master_cat_following, null,
true);
holder = new ViewHolder();
holder.i1 = (ImageView) convertView
.findViewById(R.id.labelFeaturedProfilePic);
holder.tv1 = (TextView) convertView
.findViewById(R.id.myMastCat_Cat);
holder.tv2 = (TextView) convertView
.findViewById(R.id.myMasterCat_Item);
holder.tv3 = (TextView) convertView
.findViewById(R.id.myMastCat_Username);
holder.tv3.setTypeface(roboto_regular);
holder.tv4 = (TextView) convertView
.findViewById(R.id.myMasterCat_Review);
holder.tv6 = (TextView) convertView
.findViewById(R.id.myMastCat_Date);
holder.tv7 = (TextView) convertView
.findViewById(R.id.tvFollowingCommentTotal);
holder.tv4.setTypeface(roboto_light);
holder.tv8 = (TextView) convertView
.findViewById(R.id.tvFollowingCommentLabel);
holder.tv8.setTypeface(roboto_thin);
holder.l1 = (LinearLayout) convertView
.findViewById(R.id.llFollowingCommentButton);
holder.r1 = (RelativeLayout) convertView
.findViewById(R.id.rlCommentButtonBar);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final FollowingItems mco = getItem(position);
final String item = mco.getItem();
String cat = mco.getCat();
final String user = mco.getUser();
String date = mco.getDate();
date = DateConvert.dateConvert(Long.valueOf(date));
long commentTotal = mco.getCommentCounts();
String review = mco.getReview();
String url = mco.getUrl();
holder.tv1.setTypeface(roboto_light);
holder.tv2.setTypeface(bpReplay);
holder.tv1.setText(cat);
holder.tv2.setText(item);
holder.tv3.setText(user);
holder.tv4.setText(review);
holder.tv6.setText(date);
Drawable dBlue = (Drawable) getContext().getResources().getDrawable(
R.drawable.ic_comment_blue);
Drawable dGray = (Drawable) getContext().getResources().getDrawable(
R.drawable.ic_comment_gray);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
if (commentTotal == 0) {
holder.tv7.setBackgroundDrawable(dGray);
} else {
holder.tv7.setBackgroundDrawable(dBlue);
}
} else {
if (commentTotal == 0) {
holder.tv7.setBackground(dGray);
} else {
holder.tv7.setBackground(dBlue);
}
}
holder.tv7.setText(String.valueOf(commentTotal));
if (!url.equals("http://www.rate-it-web.com/profile_pics/null")) {
imageLoader.DisplayImage(url, holder.i1);
} else {
holder.i1.setImageResource(R.drawable.usericon);
}
holder.l1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
FollowingItems mco = getItem(position);
Intent intent = new Intent(getContext(), CommentActivity.class);
// edited out
intent.putExtra("userRated", String.valueOf(mco.getUserRated()));
getContext().startActivity(intent);
}
});
holder.r1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
FollowingItems mco = getItem(position);
Intent i = new Intent(getContext(), ProfileActivity.class);
i.putExtra("userprofile", mco.getUser());
i.putExtra("userIdprofile", String.valueOf(mco.getUserId()));
getContext().startActivity(i);
}
});
return convertView;
}
答案 0 :(得分:6)
listView滚动在某些设备上不稳定
我强烈建议你阅读Romain Guy epic blog post关于识别ListView
滚动jank的内容。特别要注意透支。
另外,我不知道imageLoader
是什么,但使用StrictMode
和/或Traceview来确保它没有像在主应用程序线程上加载图像那样做蠢事。
你也可以暂时删除你的刷新内容,以确保它不是你的jank的来源。