cagryInside
cagryInside

Reputation: 800

Custom adapter getting wrong position on getView metod in ListView

I have list view with custom array adapter. I want to get items click position from getView method. I am getting a few list view items position but when i add more then 7 items into my list i get wrong position from getView method. I mean when i click 9th list item it returns 1.

Here is my code

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

        this.position = pos;
        Log.v("View position", Integer.toString(pos));

        lineView = convertView;

            if(lineView==null)
            {
                adapterLine=new AdapterLine();
                layoutInflater=context.getLayoutInflater();
                lineView=layoutInflater.inflate(com.inomera.sanalmarket.main.R.layout.adapter, null,true);
                adapterLine.sListText = (TextView) lineView.findViewById(R.id.sListText);
                adapterLine.sListCheckbox = (CheckBox) lineView.findViewById(R.id.sListCheckbox);
                adapterLine.sListImageView = (ImageView) lineView.findViewById(R.id.imageView1);
                adapterLine.gestureOverlayView = (GestureOverlayView) lineView.findViewById(com.inomera.sanalmarket.main.R.id.gestureOverlayView1);
                adapterLine.gestureOverlayView.setGestureVisible(false);

                // To remember whitch tab is selected 
                adapterLine.sListImageView.setTag(pos);
                adapterLine.sListCheckbox.setTag(pos);
                adapterLine.sListText.setTag(pos);

                Log.v("adapter", "position of adapter is " + Integer.toString(pos));

Thanks for any help!

Upvotes: 3

Views: 8387

Answers (2)

priyanka_rao
priyanka_rao

Reputation: 495

This implementation is incomplete add else section which sets value from data. here is implementation which worked for me

 public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder viewHolder;
    if (convertView == null) {
        viewHolder = new ViewHolder();
        LayoutInflater inflator = reportViewContext.getLayoutInflater();
        convertView = inflator.inflate(R.layout.tabitems, null);            
        viewHolder.name= (TextView) convertView
                .findViewById(R.id.user_reportTab_userName);            
        //set other values needed in viewHolder if any
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder)convertView.getTag();
    }
    //data is list of Data model
    if(data.size()<=0) { 
        //if data unavailable } 
    else {

     /***** Get each Model object from Array list ********/
       System.out.println("Position:"+position);

     /************ Set Model values in Holder elements ***********/

        viewHolder.name.setText(data.get(position).getName());
     }       
    return convertView;
}

I know the question is very old, answered in case anyone stumbled on similar problem

Upvotes: 0

paulb444
paulb444

Reputation: 511

The array adapter will only create one object per visible row in your list view. After this, the adapter will recycle that already created view. This is the purpose of the:

if(lineView==null)

line in your adapter.

You will want to put in an else section that sets up the row using the recycled view. This other article may be helpful:

How can I make my ArrayAdapter follow the ViewHolder pattern?

Upvotes: 3

Related Questions