滚动时ListView位置问题

Posted

技术标签:

【中文标题】滚动时ListView位置问题【英文标题】:ListView position problem while scrolling 【发布时间】:2019-03-04 05:33:39 【问题描述】:

我正在开发一个用户必须填写表格的应用程序。 该表单有一些文本视图、编辑文本、一个列表视图和两个按钮。

列表视图由一个文本视图和两个单选按钮组成。 我用一个问题和每行两个单选按钮填充列表视图。 如果我重用在覆盖的 getView 方法中给出的转换视图,当我检查一个单选按钮时,它会根据每个滚动的屏幕检查向下滚动时可见的第一个单选按钮。

 @Override
public View getView(int position, View convertView, ViewGroup parent)
    if(convertView == null)
        convertView = ((Activity)context).getLayoutInflater().inflate(R.layout.riskrowlayout, parent, false);
    

    ((TextView)convertView.findViewById(R.id.tvPreg)).setText(data.get(position));
    return convertView;

否则,如果我每次调用 getView 时都膨胀布局,它会自动取消选中我在滚动时选中的单选按钮。

@Override
public View getView(int position, View convertView, ViewGroup parent)
    convertView = ((Activity)context).getLayoutInflater().inflate(R.layout.riskrowlayout, parent, false);

    ((TextView)convertView.findViewById(R.id.tvPreg)).setText(data.get(position));
    return convertView;

我做错了什么?我该如何解决这个问题? 如果您需要更多信息,请询问,我会给您。

非常感谢您!

上一条评论的问题解决了,刚刚从another post粘贴了这段代码:

@Override
public int getViewTypeCount()                  
return getCount();


@Override
public int getItemViewType(int position) 
return position;

【问题讨论】:

【参考方案1】:

您需要将支票数据保存到一个数组中。当您向下滚动并返回检查行时,它不知道检查的位置。如果您没有模型数组,只需创建一个选中列表并在 getview 方法内部和内部设置所有 false 查看数组。

@Override
public View getView(int position, View convertView, ViewGroup parent)
    if(convertView == null)
        convertView = ((Activity)context).getLayoutInflater().inflate(R.layout.riskrowlayout, parent, false);
    

    TextView textView = (TextView) convertView.findViewById(R.id.tvPreg);


    textView.setText(data.get(position));
    radioButton.setChecked(checked.get(position));


    return convertView;

【讨论】:

完成了一半。我用 textview 和一个字符串创建了一个自定义对象,所以我可以知道是否单击了单选按钮以及单击了哪个单选按钮。现在的问题是,如果我离开: if(convertView == null) convertView = ((Activity)context).getLayoutInflater().inflate(R.layout.riskrowlayout, parent, false);并单击一个单选按钮,滚动时会自动单击许多单选按钮。如果我删除 if 语句然后离开是否有问题: convertView = ((Activity)context).getLayoutInflater().inflate(R.layout.riskrowlayout, parent, false);谢谢! convertView 参数本质上是一个“ScrapView”,如本文所述。 lucasr.org/2012/04/05/performance-tips-for-androids-listview我认为如果你删除的语句可能有问题。 好的,过去 4 小时我一直在尝试解决此问题。问题是,如果我离开 if 语句并选择一个单选按钮,getViews 的位置是随机的,所以当我滚动时,许多单选按钮出现被选中。否则,如果我删除 if 语句,一切正常,但列表视图的性能明显更差。我能做什么? 您需要添加另一个列表来存储您的单选按钮选中或未选中状态。在 getView() 中定义您的单选按钮,就像在 textView 上所做的那样。并这样做:radioButton.setChecked(checked.get(position))... checked 将是一个列表类型 bool。 是的,那和我添加到 OP 的代码解决了这个问题。非常感谢!!!!

以上是关于滚动时ListView位置问题的主要内容,如果未能解决你的问题,请参考以下文章

滚动时ListView位置问题

滚动时ListView位置问题

在 Flutter 中使用 InheritedWidget 时 ListView 失去滚动位置

如何在 listView 中设置最终滚动的位置?

Flutter中如何检测ListView的滚动位置

返回ListView时保持/保存/恢复滚动位置