【问题标题】:First item of listview shows repeated resultslistview的第一项显示重复的结果
【发布时间】:2019-10-27 03:58:41
【问题描述】:

我的应用程序有一个对话框,显示用户保存的最喜欢的球的列表视图。 listview 的每一项应该有 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)。看来这是列表视图问题错误地膨胀到第一项。 listview 的第一行显示了许多重复的项目,而从第二行开始的球是按顺序排列的。每排应该有6个球。 getChildCount 显示如下模式:

对于节省的 3 个插槽,第一行的子数为 150 (=6balls*3slots*8 + 6)。

对于节省的 4 个插槽,第一行的子数为 198 (=6balls*4slots*8 + 6)。

对于保存的 5 个插槽(如下面的屏幕截图),第一行的子数为 246 (=6balls*5slots*8 + 6)。

截屏如下:

【问题讨论】:

  • 你在使用视图支架吗?

标签: android listview split android-inflate


【解决方案1】:

似乎getView() 通常 - 尤其是 getView(0) - 会比数据列表中的项目更频繁地被调用。这不是ListViewArrayAdapter 的错误,它就是这样。

在您的getView() 实现中,您只需将子Views 添加到LinearLayout,您永远不会删除它们。

所以如果一行被回收,child Views 的数量就会变得太大。这不仅会发生在第一行,还会发生在您上下滚动时(如果列表足够长),因此会导致更多行被回收。

因为每行应该有六个球,所以您可以在行膨胀后立即将六个 ImageViews 添加到每个 LinearLayout(或者甚至使它们成为布局 xml 文件的一部分),然后循环遍历ImageViews 根据当前位置的数据交换Bitmap

【讨论】:

    猜你喜欢
    • 2020-08-30
    • 2016-09-13
    • 2019-12-22
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多