用户滚动时列表更改pos中的项目

时间:2019-02-07 18:44:55

标签: 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>

2 个答案:

答案 0 :(得分:1)

您必须将视图“绑定”移动到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())。

答案 1 :(得分:0)

您正在尝试的代码称为ListView ViewHolder模式,该概念是旧有的,因为最近引入了RecyclerView,并且默认情况下具有此功能。

基本上,您需要了解Viewholder模式的原因和工作原理,但是要给您一个思路,当滚动listview时,它实际上会添加新的视图,并且会导致性能问题,因此,当您上下滚动时,它应该被重用屏幕上不可见的相同视图/位置!举例来说,假设您的屏幕仅容纳4个项目,因此当您向上滚动时,屏幕上将显示项目编号2、3、4、5。因此,基本上在屏幕上只能看到4个项目,因此它应该重新使用相同的项目视图。

enter image description here

图片提供:https://blog.xamarin.com/creating-highly-performant-smooth-scrolling-android-listviews/

现在,关于您的代码,需要进行2个更正:

  1. 您需要将标签设置为else
  2. 按位置获取对象并将数据设置为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;
    

    }