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