检测何时从 Android ListView 中删除视图

Detect when view is removed from Android ListView

我有一个自定义 class,用作 ListView 中每个项目的 View。当 View 初始化时,它开始每秒更新一次。

在哪里可以检测到视图正在被删除,并取消计时器?

编辑:这是视图的代码。

public class CustomViewCell extends LinearLayout {

    private static final String TAG = "CustomViewCell";

    private ImageView itemImage;
    private TextView itemTitle;
    private TextView itemEstimate;
    private CustomEvent event;
    private Handler mHandler = new Handler();

    public CustomViewCell(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
    }

    @Override
    protected void onFinishInflate() {
        Log.v(TAG, "OnFinishInflate");

        itemImage = (ImageView) findViewById(R.id.itemImage);
        itemTitle = (TextView) findViewById(R.id.itemTitle);
        itemEstimate = (TextView) findViewById(R.id.itemEstimate);

        super.onFinishInflate();
    }

    public void renderWithEvent(CustomEvent event){
        this.event = event;

        String imageURL = event.imageURL();
        if (imageURL != null){
            Picasso.with(getContext()).load(imageURL).into(itemImage);
        }else{
            itemImage.setImageResource(android.R.color.transparent);
        }

        itemTitle.setText(event.title);

        mHandler.removeCallbacksAndMessages(null);
        updateEstimate();
    }

    public void updateEstimate(){
        itemEstimate.setText(event.getEstimate());

        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                updateEstimate();
            }
        }, 1000);
    }

}

这是 ListView 适配器的代码:

private class EventsAdapter extends BaseAdapter {

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

            CustomEvent event = (CustomEvent) getItem(position);
            Context context = getActivity();

            CustomViewCell eventItem;
            if (convertView == null){
                eventItem = (CustomViewCell) LayoutInflater.from(context).inflate(R.layout.cell_event, parent, false);
            }else{
                eventItem = (CustomViewCell) convertView;
            }

            eventItem.renderWithEvent(event);

            return eventItem;
        }

        ...
}

我想我明白你在找什么。试试 onDetachedFromWindow()。

mListView.setRecyclerListener(new AbsListView.RecyclerListener() {
@Override
    public void onMovedToScrapHeap(View view) {
  }
});

复制自