我有ViewPager
和GridView
来显示月历。 GridView
有大约30个元素,向左和向右滑动非常慢。我做了一个示例项目来测试没有任何数据库访问,它也很慢。也许有人看到问题或我是否必须异步加载页面?
这是GridView
中一个元素的布局。我想在任何元素中显示9个小的5x5像素图标,但没有它们,它也很慢。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/Layout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:padding="1dp">
<LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content">
<TextView android:id="@+id/date" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_marginLeft="5dp" android:gravity="center_vertical" android:textSize="14sp" android:textStyle="bold"/>
</LinearLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff">
<ImageView android:id="@+id/dot1" android:layout_width="wrap_content" android:drawingCacheQuality="auto" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:background="#ffffff" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:paddingBottom="1dp" android:paddingLeft="1dp" android:paddingTop="5dp"/>
</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff">
<ImageView android:id="@+id/dot2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:background="#ffffff" android:paddingBottom="1dp" android:paddingLeft="1dp"/>
</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff">
<ImageView android:id="@+id/dot3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_gravity="right" android:background="#ffffff" android:paddingBottom="1dp" android:paddingLeft="1dp"/>
</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff">
<ImageView android:id="@+id/dot4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_gravity="center_horizontal" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:background="#ffffff" android:paddingBottom="1dp" android:paddingLeft="1dp"/>
</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff">
<ImageView android:id="@+id/dot5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_gravity="left" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:background="#ffffff" android:paddingBottom="1dp" android:paddingLeft="1dp"/>
</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff">
<ImageView android:id="@+id/dot6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_gravity="left" android:background="#ffffff" android:paddingBottom="1dp" android:paddingLeft="1dp"/>
</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff">
<ImageView android:id="@+id/dot7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_gravity="left" android:background="#ffffff" android:paddingBottom="1dp" android:paddingLeft="1dp"/>
</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff">
<ImageView android:id="@+id/dot8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_gravity="left" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:background="#ffffff" android:paddingBottom="1dp" android:paddingLeft="1dp"/>
</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff">
<ImageView android:id="@+id/dot9" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_gravity="left" android:background="#ffffff" android:paddingBottom="5dp" android:paddingLeft="1dp"/>
</RelativeLayout>
</LinearLayout>
这是instantiateItem
适配器的GridView
:
public Object instantiateItem(ViewGroup container, int position) {
GridView gv = new GridView(m_context);
gv.setAdapter(new BaseAdapter() {
@Override
public View getView(int pos, View convertView, ViewGroup parent) {
View v;
if (convertView == null) {
// if it's not recycled, initialize some attributes
v = mInflater.inflate(R.layout.calendar_month_item, null);
} else {
v = convertView;
}
TextView dayView = (TextView) v.findViewById(R.id.date);
dayView.setText(pos + "");
return v;
}
@Override
public long getItemId(int p) {
return 0;
}
@Override
public Object getItem(int p) {
return null;
}
@Override
public int getCount() {
return 30;
}
});
gv.setNumColumns(5);
((ViewPager) container).addView(gv);
return gv;
}
答案 0 :(得分:5)
我环顾四周,我想我找到了你想要的东西:
答案 1 :(得分:2)
您使用的是哪个版本的Android?这很重要,因为Android 3.0中有一个日历,有bug,但不是那么重要。
如果我理解的话,关于你的问题。查看您的XML,它包含11个布局,这仅适用于一个元素。如果你有很多,想象一下Android系统必须做的工作量,以充气你的所有元素。然后,当您滑动时,重复使用元素,Android必须刷新无效的元素。这是很多工作。 (11个布局* 30 = 330个要刷新或膨胀的布局)。正如Android开发人员文档所述,您必须尽可能少地使用布局来包装元素!
无论如何,你的方法是不正确的。我可以建议你查看Android 3+中CalendarView的源代码,但是给你一个提示:
创建一周的布局,而不是每天(例如在CalendarView中)。通过这样做,Android将只刷新n个元素(您将选择您想要在一个时刻显示多少周),而不是30.此布局必须每天包含7个视图。
希望你能从中得到一些想法。
答案 2 :(得分:0)
首先,正如其他人所说,你的布局有点奇怪。
其次,ViewPager和PagerAdapter有点棘手。
使用@ CommonsWare的建议可能是一个好主意。 TraceView有点难以使用,但即便如此,它可能会产生一些线索。