当前位置: 首页 > 知识库问答 >
问题:

列表视图与微调内:列表视图的第一项影响其最后一项

阎璞瑜
2023-03-14

我有一个奇怪的场景,每次我从列表视图的第一项中的微调器中选择一个值,最后一个列表视图的项的微调器值与第一项相同。只有当ListView项目总数为5个及以上时,才会发生这种情况。我注释掉了代码,只保留了声明,但它仍在发生。这是Android系统的漏洞吗?

澄清:

>

  • 我的ListView的滚动侦听器为空

    我的微调器的setOnItemSseltedListener被注释掉。

    Android SDK工具版本为22.6.2

    Android SDK平台工具是19.0.1

    以下是适配器代码:

    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
    
        Viewholder v = new Viewholder();
        v.rowView = convertView;
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
        if (v.rowView == null) {
            v.rowView = inflater.inflate(R.layout.inner_base_header_cutom, parent, false);
            v.spinner = (Spinner) v.rowView.findViewById(R.id.spinner1);
            v.rowView.setTag(v);
        } else {
            v = (Viewholder) v.rowView.getTag();
        }
    
        return v.rowView;
    }
    

    观众:

    class Viewholder{
        View rowView;
        TextView itemPID;
        TextView itemPrice;
        TextView itemItemId;
        Spinner spinner;
        TextView subtotal;
    }
    

    XML:

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="100dip"
        android:layout_height="wrap_content"
        android:layout_margin="20dip"
        android:entries="@array/quanitiy"
        android:layout_alignTop="@+id/itemPrice"
        android:layout_toRightOf="@+id/imageDisplay" />
    

    数组:

       <string-array name="quanitiy">
            <item>Quantity</item>
            <item>1</item>
            <item>2</item>
            <item>3</item>
            <item>4</item>
            <item>5</item>
            <item>6</item>
            <item>7</item>
            <item>8</item>
            <item>9</item>
            <item>10</item>
        </string-array>
    

    更新我注释掉了OnItemClickListner的代码。我更新了上面的代码,问题仍然存在。只剩下声明了。

    场景:如果我在ListView的微调器[索引0]的第一项上选择1,那么ListView的微调器的最后一项也会在没有交互的情况下获得1。当将listview的项下放到最后一部分时,我发现它们都是相同的。我注释掉代码,只保留声明。

  • 共有1个答案

    秦宜修
    2023-03-14

    好的,现在我明白了。谢谢你的澄清。你的问题来自被回收的观点。你应该看看这篇文章,更好地理解回收。

    基本上,当您在getView()中使用convertView时,您是在重用不再可见的项的视图。这就是为什么它的字段(包括微调器、价格文本视图…)已经设置为某个值,您应该自己在getView()中设置它们。给出这些文本字段和微调器的值应取决于位于指定位置的项目。

    以下是回收的作用(图片取自之前提到的帖子):

    在这里,当您滚动显示一个新项目(比如项目8,如图片)时,用于显示该项目的视图与第一个项目(项目1)的视图相同。因此,当您在第一个项目的微调器上选择某个项目,然后向下滚动时,您也会看到最后一个项目中的更改,因为您的getView不会更改用于项目1的视图的值(但它应该会更新它们!)。

    注意:在您的案例中,第一个和最后一个项目的对应完全是偶然的。通常,视图被重用为两个项目,这些项目在一个屏幕高度上大约被项目的数量隔开,正如您在图片中看到的。

    Viewholder v = new Viewholder(); // why create a new one, while you might reuse the former one?
    
    // here rowView becomes the same as the former item's view, with all the former values
    v.rowView = convertView; 
    
    // you don't need this here but only in the case rowView is null, should be in your 'if'
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
    if (v.rowView == null) {
        v.rowView = inflater.inflate(R.layout.inner_base_header_cutom, parent,false);
        v.spinner = (Spinner) v.rowView.findViewById(R.id.spinner1);
        v.rowView.setTag(v);
        // here you inflated a new view (nothing reused) 
        // but you didn't initialize anything
    } else {
        v = (Viewholder) v.rowView.getTag();
        // here you're reusing the former View and ViewHolder 
        // and you don't change the values
    }
    

    你不应该让项目随心所欲,但你应该告诉他们当你在getView()中初始化项目视图的内容时应该显示什么。对于上面的图片,这意味着您需要将以前的项目1更改为项目8。

    您应该保留适配器中每个项目的状态。您可能有一个后备列表或其他东西来显示您的ListView中的不同元素,这取决于位置,对吗?然后您应该使用类似的列表(或相同的列表)来存储在微调器中选择的值,价格的文本字段显示的值等。无论如何,这些可能应该与当前列表中项目的字段相对应,所以您可能已经有地方存储它们了。

    另一方面,在重用getView()中的convertView时,请确保在位置使用正确的项目值初始化微调器(和文本字段,以及此项目视图中的所有内容)。

    Viewholder v;
    
    if (convertView == null) {
        // create a new holder for the new item view
        v = new Viewholder();
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v.rowView = inflater.inflate(R.layout.inner_base_header_cutom, parent,false);
        v.rowView.setTag(v);
    
        // populate the new holder's fields
        v.spinner = (Spinner) v.rowView.findViewById(R.id.spinner1);
        v.itemPID = (TextView) v.rowView.findViewById(...); // put the right ID here
        v.itemPrice = (TextView) v.rowView.findViewById(...); // put the right ID here
        v.itemItemId = (TextView) v.rowView.findViewById(...); // put the right ID here
        v.subtotal =  (TextView) v.rowView.findViewById(...); // put the right ID here
    } else {
        v = (Viewholder) convertView.getTag();
        // the views of v are already populated here (reused)     
    }
    
    /* 
     * Reused or not, the item view needs to be initialized here.
     * Initialize all views contained in v with values that are 
     * meaningful for the item at 'position'.
     */
    
    // for instance:
    MyItemClass theItemAtPosition = myBackingList.get(position);
    v.subtotal.setText(String.valueOf(theItemAtPosition.getSubtotal()));
    v.spinner.setSelection(theItemAtPosition.getQuantity());
    
    // to be continued, you get the idea ;)
    

     类似资料:
    • 我试图使用文本视图来显示从列表视图中选择的联系人。列表视图包含用户从加载到列表视图中的Android电话簿中选择的联系人。文本视图将只显示列表视图中的最后一项,即使用户选择了另一个不是列表视图中最后一个联系人的联系人。 即使在我的日志打印中,我可以看到我选择了哪个联系人,但当我试图将其打印到另一个窗口中的文本视图时,它仍然默认为最后一个联系人。 添加调制解调器。JAVA 主要活动。JAVA

    • 我做了一个列表视图。计划是,当你选择一个项目时,它应该显示为选中状态(背景颜色改变),当你选择另一个项目时,之前选择的项目再次正常。有办法做到这一点吗?我一直在尝试很多事情,但都没用。。。 这是我目前的代码。。。 标记其中一个是有效的,但删除选择是我的问题。有什么建议吗? 编辑:我要找的是,在我选择另一个项目之前,它一直处于选中状态

    • 我正在制作一个有评论和描述的帖子的应用程序。每个帖子上有三个按钮。1描述2评论,第三个是喜欢按钮。我在自定义适配器的getview方法中设置了一个按钮点击侦听器。当我点击描述按钮时,该帖子的描述应该显示在按钮下。但是当我点击描述按钮时,其他一些列表视图项目的描述也显示出来。我只想显示被点击描述按钮的帖子的描述。这是我的代码: getview代码: XML代码:

    • ListView控件用于显示项列表。 与TreeView控件一起,它允许您创建类似Windows资源管理器的界面。 让我们从工具箱中单击ListView控件并将其放在表单上。 ListView控件显示项目列表以及图标。 ListView控件的Item属性允许您添加和删除项目。 SelectedItem属性包含所选项的集合。 MultiSelect属性允许您在列表视图中设置选择多个项目。 Check

    • 我有一个列表视图,当我的活动开始时,我想要第一个项目将有背景,其他项目没有任何背景。之后,如果用户选择任何其他项目,则该特定项目的背景现在将为蓝色,其余部分将没有任何背景。请帮帮我。 My layout_effect.xml 设置默认背景的GetView代码 listview的任何我的onclickListner 我的列表视图xml 请帮帮我,我怎么才能解决这个问题,我从昨天开始就被困在里面了。

    • 我有一个android布局,它有一个,里面有很多元素。在的底部有一个,然后由适配器填充。 我遇到的问题是,android将从中排除,因为已经具有可滚动的功能。我希望与内容一样长,并且主滚动视图是可滚动的。 我怎样才能达到这种行为呢? 下面是我的主要布局: 然后以编程方式将组件添加到具有ID:的linearlayour中。下面是加载到LinearLayout中的一个视图。就是这个给我卷轴带来麻烦的。