在 ArrayAdapter<Integer> 中使用 remove() 方法

Use of remove() method in ArrayAdapter<Integer>

我有一个项目列表视图。每个项目都包含一个 TimeTextView(它只是一个按我想要的方式显示时间的简单 class)、另一个 TextView 和一个用于从 ListView 中删除项目的按钮。为此,我扩展了 class ArrayAdapter 并像这样重写了方法 getView() :

public class TimeListAdapter extends ArrayAdapter<Integer> {

private Context applicationContext = null;
private int layout = 0;

private class ViewHolder {
    public TimeTextView timeText;
    public TextView position;
    public ImageButton removeButton;
}

TimeListAdapter(Context context, int resource, ArrayList<Integer> objects) {
    super(context, resource, objects);
    applicationContext = context;
    layout = resource;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    final Integer newTime = getItem(position);
    ViewHolder holder = null;
    LayoutInflater inflater = (LayoutInflater) applicationContext.
            getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

    if (convertView == null) {
        convertView = inflater.inflate(layout, null);
        holder = new ViewHolder();
        holder.timeText = (TimeTextView) convertView.findViewById(R.id.time_text);
        holder.position = (TextView) convertView.findViewById(R.id.position);
        holder.removeButton = (ImageButton) convertView.findViewById(R.id.remove_button);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.timeText.setTime(newTime);
    holder.position.setText((new Integer(position + 1)).toString() + ".");
    holder.removeButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            remove(newTime);
        }
    });

    return convertView;
}
}

现在我的问题是,如果您放置两个具有相同值的项目,即使您单击了第二个项目的按钮,remove() 方法的调用也会自动删除第一个。例如,如果您的列表中有值 (12, 16, 12),您单击按钮删除第三项,则第一项将被删除。

到目前为止,我找到的唯一解决方案是制作一个 IntegerWrapper class,它只包含一个 Integer 作为 public 属性。但是我发现在我的其余代码中使用起来非常不方便。

谁有更优雅的解决方案?

执行以下操作

  • 在你里面注册 onItemClickListener Activity class 这会给你一个方法 onItemClick 在那个方法中做以下事情

            arrayAdapter.setOnItemClickListener(
            new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
               objects.remove(position);
            arrayAdapter.notifyDataSetChanged();
            }
        });
    

这将删除您想要的职位。