Android - How to get position in bindView like in getView?
Asked Answered
C

3

19

In getView() of CursorAdapter, there's a parameter position so I can do a checking for that position, how can I do the same on bindView() it has no position parameter in BindView.

Currently I'm overriding newView(), bindView() and getView() which I read and heard is bad, either override getView() OR newView() and getView().

Thanks.

Crackpot answered 28/1, 2013 at 2:32 Comment(1)
I am not sure your last statement is correct. I think it should read "Either override getView or (newView and bindView)". There is a default implementation of getView, that calls newView if there isn't a view yet, and bindView if the view is being recycled.Coxa
E
36

Try this

public void bindView(View arg0, Context arg1, Cursor arg2)
{
    int pos = arg2.getPosition();
}
Esmond answered 28/1, 2013 at 5:38 Comment(1)
yeah I think this is it. But why is the cursor.getPosition() in bindView differs from the result of doing the cursor.getPosition() in newView. More on that here: #14557751Crackpot
R
5

codeboys answer is correct, cursor.getPosition() will do. But if someone needs position in the onClick event of listitems subitem, for instance icon inside the listItem, the solution is to put a position as setTag on the icon and retreive it when event occurs:

@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());   // here you set position on a tag
    icon.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //  use a tag to get the right position 
            ((MainActivity) context).onIconClick((int)v.getTag());
        }
    });
}
Roesler answered 22/8, 2016 at 12:30 Comment(1)
There is no need to use "Tag" here because Java supports closures. You can use pos captured from the outer context inside your click listener if it is defined inside bindView as it is in your exampleEndue
E
0
@Override
public void bindView(View view, Context context, Cursor cursor) {
    // TODO Auto-generated method stub

}

@Override
public View newView(Context context, Cursor cursor, ViewGroup view) {
    // TODO Auto-generated method stub
    int mCount = cursor.getCount();
    //Returns Total count(Rows) in cursor

     int currentPostion= cursor.getPosition();
    //Returns the current position of the cursor in the row set
}
Elkeelkhound answered 28/1, 2013 at 7:29 Comment(4)
how do i know what view I'm dealing with in bindView if I'm having two layouts in newView. please see #14557751Crackpot
This will not work. ListView recycles rows, so newView only gets called for a subset of the total rows you can scroll view. If you used getPosition() in bindView you would effectively track the currently drawn position.Coxa
@Coxa Then how would you do it?Heartland
@mattblang as I said in my previous comment, the default implementation doesn't call newView on every list item because it re-uses list items. A reused list item gets called in bindView, so you need to use cursor.getPosition() in both bindView and newView.Coxa

© 2022 - 2024 — McMap. All rights reserved.