Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用户滚动时列表中的项目更改位置_Javascript_Android - Fatal编程技术网

Javascript 用户滚动时列表中的项目更改位置

Javascript 用户滚动时列表中的项目更改位置,javascript,android,Javascript,Android,你知道我如何让物品保持在正确的位置吗? 当前,当用户在列表上下滚动时,它们会移动位置。 我读了一些关于以下脚本的内容,但没有弄清楚如何使其工作 @凌驾 公共int getViewTypeCount{ @凌驾 public int getItemViewTypeint position{您正在尝试的代码称为ListView视图持有者模式,这个概念是旧的,因为最近引入了RecyclerView,默认情况下它具有此功能 基本上,您需要了解Viewholder模式的工作原理和方式,但为了让您了解,当您

你知道我如何让物品保持在正确的位置吗? 当前,当用户在列表上下滚动时,它们会移动位置。 我读了一些关于以下脚本的内容,但没有弄清楚如何使其工作

@凌驾 公共int getViewTypeCount{ @凌驾
public int getItemViewTypeint position{您正在尝试的代码称为ListView视图持有者模式,这个概念是旧的,因为最近引入了RecyclerView,默认情况下它具有此功能

基本上,您需要了解Viewholder模式的工作原理和方式,但为了让您了解,当您滚动listview时,它实际上会添加新的视图,这会导致性能问题,因此,当您上下滚动时,它实际上应该重复使用屏幕上不可见的相同视图/位置!例如,假设您的屏幕accoMMO只显示4个项目,因此当您向上滚动时,它会显示项目编号2、3、4、5。因此,基本上只有4个项目在屏幕上可见,因此它应该重复使用相同的项目视图

图片提供:

现在,关于您的代码,需要两个更正:

您需要在else条件下设置标记。 按位置获取对象,并将数据设置为if/else块外部的视图

@Override
public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder;

if (convertView == null) {
    convertView = mInflater.inflate(R.layout.list_entry, null);
    holder = new ViewHolder();
    holder.nameTextView = (TextView) convertView.findViewById(R.id.person_name);
    convertView.setTag(holder);
}
else {
    holder = (ViewHolder) convertView.getTag();  // Notice this change - 1
}

Person person = getItem(position);
holder.nameTextView.setText(person.getName());  // Notice this change - 2

return convertView;
}


您必须将视图绑定移到if/else分支之外,以便每次都更新视图。否则,您将从无意义的位置回收视图

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder mainViewHolder = null;

    if (convertView == null) {
        LayoutInflater inflater = LayoutInflater.from(getContext());
        convertView = inflater.inflate(layout, parent, false);

        mainViewHolder = new ViewHolder();
        mainViewHolder.thumbnail = (ImageView) convertView.findViewById(R.id.list_item_thumbnail);
        mainViewHolder.day = (TextView) convertView.findViewById(R.id.list_item_days);
        mainViewHolder.time = (TextView) convertView.findViewById(R.id.list_item_time);
        mainViewHolder.button = (Button) convertView.findViewById(R.id.list_item_btn);
        mainViewHolder.switchx = (Switch) convertView.findViewById(R.id.list_item_switch);

        convertView.setTag(viewHolder);
    } else {
        mainViewHolder = (ViewHolder) convertView.getTag();
    }

    final Alarm alarm = alarms.get(position);
    mainViewHolder.day.setText(alarm.GetDays());
    mainViewHolder.time.setText(alarm.GetTime());

    mainViewHolder.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            EditAlarm(alarm);
        }
    });

    return convertView;
}
当convertView为空时,这意味着不会发生回收。因此,您可以膨胀布局并创建ViewHolder

当convertView不为null时,这意味着视图正在被回收。这意味着您之前已经扩展了布局并创建了一个ViewHolder,所以您所要做的就是从getTag方法中检索ViewHolder


然后,在这两种情况下,您都希望填充视图。因此,无论视图是否被回收,您都应该始终更新每个子视图,例如day.setText。

将查看RecyclerView!感谢您提供的信息,我刚刚读了一些关于ListView的内容,因此我理解了您的观点。谢谢:@Tore很高兴答案为您指明了方向!继续学习和学习分享。