javascript - 当用户滚动时列表中的项目更改位置

标签 javascript android

知道如何让元素保持在正确的位置吗? 目前,当用户上下滚动列表时,它们会移动位置。 我读了一些有关下面脚本的内容,但不知道如何使其工作。

 @Override
        public int getViewTypeCount() {
        
@Override
        public int getItemViewType(int position) {

我的代码:

private class MyListAdapter extends ArrayAdapter < Alarm > {

  private int layout;
  private MyListAdapter(Context context, int resource, List < Alarm > objects) {
    super(context, resource, objects);
    layout = resource;
  }

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

    final Alarm alarm = alarms.get(position);
    if (convertView == null) {
      LayoutInflater inflater = LayoutInflater.from(getContext());
      convertView = inflater.inflate(layout, parent, false);
      ViewHolder viewHolder = new ViewHolder();
      viewHolder.thumbnail = (ImageView) convertView.findViewById(R.id.list_item_thumbnail);
      viewHolder.day = (TextView) convertView.findViewById(R.id.list_item_days);
      viewHolder.time = (TextView) convertView.findViewById(R.id.list_item_time);
      viewHolder.button = (Button) convertView.findViewById(R.id.list_item_btn);
      viewHolder.switchx = (Switch) convertView.findViewById(R.id.list_item_switch);

      viewHolder.day.setText(alarm.GetDays());
      viewHolder.time.setText(alarm.GetTime());


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

      convertView.setTag(viewHolder);
    } else {
      //mainViewHolder = (ViewHolder) convertView.getTag();
      //mainViewHolder.day.setText("hey ");
    }

    return convertView;
  }


}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

最佳答案

您必须将 View “绑定(bind)”移到 if/else 分支之外,以便每次都会更新 View 。否则,您将获得从无意义的位置回收的 View 。

@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为null时,意味着没有发生回收。因此,您可以扩展布局并创建 ViewHolder。

convertView不为null时,表示 View 正在被回收。这意味着您之前已经膨胀了布局并创建了 ViewHolder,因此您所要做的就是从 getTag() 方法检索 ViewHolder。

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

关于javascript - 当用户滚动时列表中的项目更改位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54580220/

相关文章:

javascript - d3.js 树 - 为指定的子节点设置深度?

javascript - 我如何发现触发事件的 DOM 元素并相应地表现

android - 用户卸载 Android 应用程序时的通知

java - 无法为 LibVLC 设置选项

android - GROUP BY 与 CursorLoader

javascript - 使用 fetch 比较 2 个页面的 HTML

javascript - 如何使用 ".replace()"和 ".html()"将明文转换为图像标签?

javascript - [].map.call() VS Array.prototype.map.call()?

java - 安卓工作室 : connecting to MongoDB server with Mongo Java Driver

java - 如何在 onCreate() 中重复验证指纹