Android Gallery's getView() returning incorrect position

Thanks for reading!

I am using the Android Gallery with both LayoutParams as MATCH_PARENT to show one full screen image at a time.

Here's my code:

layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent">
    <Gallery
        android:id="@+id/gallery" android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    </Gallery>
    <TextView android:id="@+id/tvShowText" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:layout_alignParentBottom="true" />
</RelativeLayout>

HelloGallery.java

package com.android.sagar;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class HelloGallery extends Activity {

    TextView tvShowText = null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        tvShowText = (TextView)findViewById(R.id.tvShowText);

        Gallery g = (Gallery) findViewById(R.id.gallery);
        g.setAdapter(new ImageAdapter(this));

        g.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView parent, View v, int position, long id) {
                Toast.makeText(HelloGallery.this, "" + position, Toast.LENGTH_SHORT).show();
            }
        });
    }

    public class ImageAdapter extends BaseAdapter {
        int mGalleryItemBackground;
        private Context mContext;

        private Integer[] mImageIds = {
                R.drawable.pic1,
                R.drawable.pic2,
                R.drawable.pic3
        };

        public ImageAdapter(Context c) {
            mContext = c;
        }

        public int getCount() {
            return mImageIds.length;
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView i = new ImageView(mContext);

            tvShowText.setText("ImageCaption for Image No.: "+position);

            i.setImageResource(mImageIds[position]);
            i.setLayoutParams(new Gallery.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
            i.setScaleType(ImageView.ScaleType.FIT_XY);
            i.setBackgroundResource(mGalleryItemBackground);

            return i;
        }
    }
}

The images show correctly but the caption that I print is off by one or sometimes totally different. :(

I debugged and found that when I swipe once, the getView() gets called multiple times - around 2 to 3 times...and they are all different positions but the image appears to be moving one at a time. :( Please help!

Answers


In order to update your caption correctly you need to override the Gallery's OnItemSelectedListener. Sujit is correct in his comment that getView is called in order to render (or pre-render, or post-render in some cases) each image in the Gallery. It shouldn't be depended on to identify which image is selected. Instead, override OnItemSelectedListener in your HelloGallery onCreate() method:

    g.setOnItemSelectedListener(new OnItemSelectedListener() 
    {
       @Override
       public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
       {
          tvShowText.setText("ImageCaption for Image No.: "+position);
       }
       @Override
       public void onNothingSelected(AdapterView<?> arg0) 
       {
          tvShowText.setText("No image selected");
       }
    });            

Need Your Help

installing django 1.5(development version) in virtualenv

python django virtualenv

I am trying to start developing a web apps using django 1.5 but I can't figure out how to install the django 1.5 in the virtualenv because django 1.5 is still a development version.

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.