从ListView中获取与SimpleCursorAdapter绑定的选定项

时间:2011-05-27 19:29:03

标签: android listview simplecursoradapter

我是Android开发的新手......来自iPhone和.Net背景。我见过与此问题非常相似的问题,但没有一个问题涉及SimpleCursorAdapter。

我有一个基本的ListActivity,它使用Cursor将SQLite查询中的数据绑定到我的ListView:

ListAdapter adapter = new SimpleCursorAdapter(
        this, 
        android.R.layout.simple_list_item_1,  
        c,        
        new String[] {"name"},   
        new int[] {android.R.id.text1}); 

setListAdapter(adapter);

然后点击某个项目时:

public void onListItemClick(ListView l, View v, int position, long id) {

    super.onListItemClick(l, v, position,  id);

    //Difference between this:
    Cursor c = (cursor)l.getItemAtPosition(position);
    //and this??
    Cursor c = (Cursor)l.getAdapter().getItem(position);

    int categoryId = c.getInt(0);
}

这是获取所选元素的id的正确方法吗?这看起来很奇怪,因为我不认为我可以在数据库关闭后使用我的光标(这是在我绑定之后)。当我无法找到从该ID中获取实际项目的方法时,传入ID的重点是什么?另外,我不明白为什么getItemAtPosition()会返回一个游标......游标被绑定到整个列表;不只是一排。最后,如果这是正确的,获得光标的两种方式之间是否存在差异?感谢。

2 个答案:

答案 0 :(得分:82)

所以有几点:在您获取光标后,您想要调用startManagingCursor。这将光标的生命周期与Activity的生命周期联系起来(因此当Activity被销毁时,光标会被关闭/清理)。

startManagingCursor(c);
ListAdapter adapter = new SimpleCursorAdapter(
        this, 
        android.R.layout.simple_list_item_1,  
        c,        
        new String[] {"name"},   
        new int[] {android.R.id.text1}); 
setListAdapter(adapter);

此外,数据库不是关闭,Cursor通常保持与DB的实时连接(因此ListView可以滚动并执行这种性质的事情,可能需要将来访问Cursor的内容

对于您的核心问题,在onListItemClick中执行此操作的最简单方法是:

Cursor c = ((SimpleCursorAdapter)l.getAdapter()).getCursor();
c.moveToPosition(position);

然后,您可以使用c.getLong(0)来获取ID(假设您将id列作为第一列获取,通常就是这种情况)。但是,请注意,id作为签名的一部分传入(请参阅public void onListItemClick(ListView l, View v, int position, long id)中的最后一个参数),因此您实际上不需要再次获取它(但如果您想要刻录循环,您肯定可以) 。要访问其他列,您可以执行相同的操作,只需更改列索引。

希望有所帮助。

答案 1 :(得分:0)

另一种方式:

$(function() {

    var lastMin;
    var lastMax;
    var maxRange = 12 * 30 * 24 * 3600 * 1000; //12 month

    $('#container').highcharts('StockChart', {
        scrollbar: {
            liveRedraw: false
        },

        xAxis: {
            events: {
                afterSetExtremes: function(e) {
                    var max = this.max,
                        min = this.min;

                    if (lastMin && lastMax) {
                        if(max-min > maxRange) {
                            if (min < lastMin) {
                                min = max - maxRange;
                            } else {
                                max = min + maxRange;
                            }
                        }
                    }

                    var x = this;
                    setTimeout(function(){ 
                        x.setExtremes(min,max); //chart xAxis
                    }, 1);

                    lastMin = min;
                    lastMax = max;
                }
            }
        },
        rangeSelector: {
            selected: 1
        },
        series: [{
            name: 'USD to EUR',
            data: usdeur
        }]
    });
});