列表视图的第一项显示重复的结果
First item of listview shows repeated results
我的应用程序有一个对话框,显示用户保存的最喜欢的球的列表视图。列表视图的每个项目应该有 6 个球。
代码:
String action = "favoriteId ASC";
Favorite = Select.from(Favorites.class).where(Condition.prop("favoritemode").eq(""+ Constants.mode)).orderBy(action).list();
FavAdapter adapter = new FavAdapter(LuckyNumber.this, Favorite);
lv_content.setAdapter(adapter);
public class FavAdapter extends ArrayAdapter<Favorites> {
public FavAdapter(Context context, List<Favorites> fav) {
super(context, 0, fav);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Favorites fav = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item_favorite, parent, false);
}
final LinearLayout ll_ball2 = (LinearLayout) convertView.findViewById(R.id.ll_ball2);
ImageView btn_use = (ImageView) convertView.findViewById(R.id.btn_use);
ImageView btn_delete = (ImageView) convertView.findViewById(R.id.btn_delete);
TextView tv_check = (TextView) convertView.findViewById(R.id.tv_check);
String result = fav.getfavoriteslot();
String [] temp = null;
temp = result.split("--");
String ss = "";
for (int m=0; m< temp.length; m++)
{
try
{
ss = ss + "." + temp[m] ;
ImageView slot_ball = new ImageView(LuckyNumber.this);
slot_ball.setEnabled(false);
slot_ball.setImageBitmap(return_bm (Integer.valueOf(temp[m])+""));
slot_ball.setScaleType(ImageView.ScaleType.FIT_XY);
ll_ball2.addView(slot_ball);
}
catch (Exception ex)
{
}
}
tv_check.setText(""+ss + "...Size=" + temp.length + "Childview=" + ll_ball2.getChildCount());
return convertView;
}
}
list_item_favorite.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@null"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/ll_row2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="left|center_vertical"
android:orientation="horizontal" >
<RelativeLayout
android:id="@+id/keyboard_frame_btn_row"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:orientation="horizontal"
android:splitMotionEvents="false" >
<LinearLayout
android:id="@+id/ll_ball2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="left|center_vertical"
android:gravity="left|center_vertical"
android:splitMotionEvents="false">
</LinearLayout>
<TextView
android:id="@+id/tv_check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/ll_ball2">
</TextView>
<ImageButton
android:id="@+id/btn_use"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_margin="@dimen/dp2"
android:layout_toLeftOf="@+id/btn_delete"
android:background="@null"
android:scaleType="fitCenter"
android:src="@drawable/btn_use_selector" />
<ImageButton
android:id="@+id/btn_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_gravity="center_vertical"
android:layout_margin="@dimen/dp2"
android:background="@null"
android:scaleType="fitCenter"
android:src="@drawable/btn_delete_selector" />
</RelativeLayout>
</LinearLayout>
<RelativeLayout
android:id="@+id/row3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp2"
android:gravity="center"
android:splitMotionEvents="false" >
<View
android:id="@+id/view1"
android:layout_width="fill_parent"
android:layout_height="2px"
android:layout_margin="@dimen/dp5"
android:background="@color/black" />
</RelativeLayout>
</LinearLayout>
问题:
tv_check
表明对于每个最喜欢的插槽,它确实知道每个插槽有 6 个球(大小 =6)。看来这是错误地膨胀到第一项的列表视图问题。列表视图的第一行显示了很多重复的项目,而从第二行开始的球是有序的。每行应该有 6 个球。 getChildCount 显示如下模式:
对于保存的 3 个插槽,第一行的子节点数为 150(=6 个球*3 个插槽*8 + 6)。
对于保存的 4 个插槽,第一行的子节点数为 198(=6 个球*4 个插槽*8 + 6)。
对于保存的 5 个插槽(如下面的屏幕截图所示),第一行的子节点数为 246(=6 个球*5 个插槽*8 + 6)。
截屏如下:
似乎 getView()
通常 - 尤其是 getView(0) - 将比数据列表中的项目更频繁地被调用。这不是 ListView
或 ArrayAdapter
的错误,它就是事情的本来面目。
在 getView()
的实施中,您只将子 View
添加到 LinearLayout
,您永远不会删除它们。
所以如果一行被回收,子View
的数量会变得太大。这不仅会发生在第一行,当您上下滚动时(如果列表足够长)也会发生,因此会导致更多行被回收。
由于每行应该有六个球,您可以在行膨胀后立即向每个 LinearLayout
添加六个 ImageView
(或者甚至使它们成为布局的一部分 xml 文件),然后循环遍历 ImageView
s 以根据当前位置的数据交换 Bitmap
。
我的应用程序有一个对话框,显示用户保存的最喜欢的球的列表视图。列表视图的每个项目应该有 6 个球。
代码:
String action = "favoriteId ASC";
Favorite = Select.from(Favorites.class).where(Condition.prop("favoritemode").eq(""+ Constants.mode)).orderBy(action).list();
FavAdapter adapter = new FavAdapter(LuckyNumber.this, Favorite);
lv_content.setAdapter(adapter);
public class FavAdapter extends ArrayAdapter<Favorites> {
public FavAdapter(Context context, List<Favorites> fav) {
super(context, 0, fav);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Favorites fav = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item_favorite, parent, false);
}
final LinearLayout ll_ball2 = (LinearLayout) convertView.findViewById(R.id.ll_ball2);
ImageView btn_use = (ImageView) convertView.findViewById(R.id.btn_use);
ImageView btn_delete = (ImageView) convertView.findViewById(R.id.btn_delete);
TextView tv_check = (TextView) convertView.findViewById(R.id.tv_check);
String result = fav.getfavoriteslot();
String [] temp = null;
temp = result.split("--");
String ss = "";
for (int m=0; m< temp.length; m++)
{
try
{
ss = ss + "." + temp[m] ;
ImageView slot_ball = new ImageView(LuckyNumber.this);
slot_ball.setEnabled(false);
slot_ball.setImageBitmap(return_bm (Integer.valueOf(temp[m])+""));
slot_ball.setScaleType(ImageView.ScaleType.FIT_XY);
ll_ball2.addView(slot_ball);
}
catch (Exception ex)
{
}
}
tv_check.setText(""+ss + "...Size=" + temp.length + "Childview=" + ll_ball2.getChildCount());
return convertView;
}
}
list_item_favorite.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@null"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/ll_row2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="left|center_vertical"
android:orientation="horizontal" >
<RelativeLayout
android:id="@+id/keyboard_frame_btn_row"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:orientation="horizontal"
android:splitMotionEvents="false" >
<LinearLayout
android:id="@+id/ll_ball2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="left|center_vertical"
android:gravity="left|center_vertical"
android:splitMotionEvents="false">
</LinearLayout>
<TextView
android:id="@+id/tv_check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/ll_ball2">
</TextView>
<ImageButton
android:id="@+id/btn_use"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_margin="@dimen/dp2"
android:layout_toLeftOf="@+id/btn_delete"
android:background="@null"
android:scaleType="fitCenter"
android:src="@drawable/btn_use_selector" />
<ImageButton
android:id="@+id/btn_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_gravity="center_vertical"
android:layout_margin="@dimen/dp2"
android:background="@null"
android:scaleType="fitCenter"
android:src="@drawable/btn_delete_selector" />
</RelativeLayout>
</LinearLayout>
<RelativeLayout
android:id="@+id/row3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp2"
android:gravity="center"
android:splitMotionEvents="false" >
<View
android:id="@+id/view1"
android:layout_width="fill_parent"
android:layout_height="2px"
android:layout_margin="@dimen/dp5"
android:background="@color/black" />
</RelativeLayout>
</LinearLayout>
问题:
tv_check
表明对于每个最喜欢的插槽,它确实知道每个插槽有 6 个球(大小 =6)。看来这是错误地膨胀到第一项的列表视图问题。列表视图的第一行显示了很多重复的项目,而从第二行开始的球是有序的。每行应该有 6 个球。 getChildCount 显示如下模式:
对于保存的 3 个插槽,第一行的子节点数为 150(=6 个球*3 个插槽*8 + 6)。
对于保存的 4 个插槽,第一行的子节点数为 198(=6 个球*4 个插槽*8 + 6)。
对于保存的 5 个插槽(如下面的屏幕截图所示),第一行的子节点数为 246(=6 个球*5 个插槽*8 + 6)。
截屏如下:
似乎 getView()
通常 - 尤其是 getView(0) - 将比数据列表中的项目更频繁地被调用。这不是 ListView
或 ArrayAdapter
的错误,它就是事情的本来面目。
在 getView()
的实施中,您只将子 View
添加到 LinearLayout
,您永远不会删除它们。
所以如果一行被回收,子View
的数量会变得太大。这不仅会发生在第一行,当您上下滚动时(如果列表足够长)也会发生,因此会导致更多行被回收。
由于每行应该有六个球,您可以在行膨胀后立即向每个 LinearLayout
添加六个 ImageView
(或者甚至使它们成为布局的一部分 xml 文件),然后循环遍历 ImageView
s 以根据当前位置的数据交换 Bitmap
。