滚动时如何在listView中标记项目?

时间:2012-10-11 04:26:29

标签: android listview

我正在构建我的第一个应用程序。它只是文本消息(SMS)收到的服务器警报列表。只有列表视图操作(没有关于点击的详细信息)。我希望能够通过阅读它们来标记读取的项目。当我打开我的应用程序时,我看到从旧到新排序的消息,我的listView位置设置在listView的底部。当我向上滚动时,显示的项目我想标记为已读。

我这样做了:

public class AlertsListFragment extends ListFragment {
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        // ...
        Cursor c = context.getContentResolver().query(uri, AlertsContract.PROJECTION, selection, selectionArgs, null);
        adapter = new AlertAdapter(context, R.layout.row, c, from, to, 0);
        setListAdapter(adapter);
        ListView listView = getListView();
        listView.setSelected(listView.getCount());

        lv.setOnScrollListener(new AbsListView.OnScrollListener() {
            public void onScrollStateChanged(AbsListView view, int scrollState) { }

            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                for (int i = firstVisibleItem; i < firstVisibleItem + visibleItemCount; i++) {
                    Cursor cursor = (Cursor)view.getItemAtPosition(i);
                    long id = cursor.getLong(cursor.getColumnIndex(AlertsContract._ID));
                    String type = cursor.getString(cursor.getColumnIndex(AlertsContract.TYPE));
                    Log.d("VIEWED", "This is viewed "+ type + " id: " + id);

                    // here I can get the id and mark the item read
                }
            }
        });
    }
}

但我认为,这不是最好的解决方案。一个问题是,如果用户不打算滚动列表,即使用户可以从列表中看到至少3-4个项目,也没有任何项目被标记为已查看。

列表视图项目是否有“显示”或类似的事件?每次listView项到达listView的可见区域时都会发生一些事件?

1 个答案:

答案 0 :(得分:0)

也许您应该尝试使用适配器的getView方法。 (Reference

每次ListView尝试显示项目时都会调用它。

但要小心,当项目未完全显示时也会调用它,因此您应该再次检查,也许使用onScroll方法中的解决方案。