使用CursorAdapter在bindView中获取一个位置

时间:2014-12-27 10:05:10

标签: android listview android-cursoradapter

我创建了一个列表视图,其中包含两个TextView和一个自定义视图作为选择指标,用于加载我正在使用CursorAdapter并覆盖bindViewnewView的数据。但问题在于保留选择指数。

当我点击列表项时,我将其位置保存到视图中,如下所示

View v1=(View)view.findViewById(R.id.viewColor);
v1.setTag(position)

但在bindView内部我没有得到一个位置,我可以通过从视图的标签中获取位置来执行匹配,如下所示

 Integer position = (Integer) v1.getTag();

但我没有能够比较我们进入getView的方式。我试过cur.getPosition()是光标中与v1.getTag()不匹配的记录的位置。

我尝试按如下方式覆盖getView,但没有获得准确的位置

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

    this.position = position;
    return super.getView(position, convertView, parent);


}

那我怎么能在bindView中获得这个位置呢?我需要使用getView还是什么?我探索了许多线程,但在bindView方面我没有得到任何明确的答案。

修改

        @Override
        public void onItemClick(AdapterView<?> adapter, View view, int position,
                long arg3) {


                    view.setTag(position); 
                   // i save the position on list item click so that when adapter loads the 
                   // the list i can match the position with the current one

          }

enter image description here

4 个答案:

答案 0 :(得分:2)

首先,您需要覆盖getView()并在此处设置位置,然后在bindview()中访问它。

@Override
public View getView(int position, View convertview, ViewGroup arg2) {
    if (convbertview == null) {
        LayoutInflater inflater = LayoutInflater.from(context);
        convertview = inflater.inflate(R.layout.your layout,
                null);
    }
    convertview.setTag(position);
    return super.getView(position, convbertview, arg2);
}

并在bindView()中获得您的位置

@Override
public void bindView(View view, Context context, Cursor cursor) {
    int position=(Integer) view.getTag();//here is the position

}

答案 1 :(得分:2)

因为您使用CursorAdapter,所以不要覆盖getView。您可以在bindView中注册onClickListener。假设您正在聆听点击图标,那么您确实喜欢这样:

@Override
public void bindView(View vw, Context ctx, final Cursor cursor) {
    /* 
    *   do your binding
    */
    ImageView icon = (ImageView) vw.findViewById(R.id.your_icon);
    icon.setTag(cursor.getPosition());
    icon.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // here you pass right position to your activity
            ((MainActivity) context).onIconClick((int)v.getTag());  
        }
    });
}

在您的活动中:

public void onIconClick(int position) {
    // do your stuff
}

答案 2 :(得分:0)

更改你的onItemClick,如下所示

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    mAdapter.setId(id);
    //Set the selector here
}

然后在适配器中维护一个id变量并为其编写setter和getter。然后更改bindView()方法,如下所示

@Override
public void bindView(View view, Context context, Cursor cursor) {

    long tempId = cursor.getLong(cursor.getColumnIndex("_id"));

    if(tempId==id){
        //Set the selector color here
    }
    else{
        //Set the default color here
    }

    //Remaing your logic here
}

这样就不需要覆盖getView()方法了。

如果要选择多个视图,则必须维护ID的ArrayList ...

答案 3 :(得分:0)

在“ bindView”方法内部,但在“ onClickListener()”之外:

  1. final int position = cursor.getPosition();

  2. 在“ onClickListener()”内部:

cursor.moveToPosition(position); //retrieve any data you want after this

祝你好运〜