Search code examples
androidandroid-viewpagerandroid-pageradapter

Button on ViewPager returning wrong value


I have a ViewPager which uses a PagerAdapter. On the page I have a single TextView and a Button. I want the button to lift the relevant data from the DataRecord (I obviously know I can get it from the TextView but this is just a simplified version of my more complex code for illustration purposes)

The ViewPager works fine, and I can swipe between screens as expected. However, when the button is clicked, it does not display the correct data from the PagerAdapter.

For example, the first page shows the TextView containing "Data Item 1" as expected, but clicking the button on the first page the Log.d shows "Data Item 3"

I am pretty sure this is something to do with the way the Pager stores data not currently on screen, but I don't know how to resolve it?

StartActivity Class

public class StartActivity extends Activity {

FullScreenImageAdapter adapter;
ViewPager viewPager;

ArrayList<DataRecord> datalist;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fullscreen_view);

    datalist = new ArrayList<DataRecord>();

    viewPager = (ViewPager) findViewById(R.id.pager);

    DataRecord dataRecord = new DataRecord("Data Item 1 ");
    datalist.add(dataRecord);

    dataRecord = new DataRecord("Data Item 2 ");
    datalist.add(dataRecord);

    dataRecord = new DataRecord("Data Item 3");
    datalist.add(dataRecord);


    adapter = new FullScreenImageAdapter(this, datalist);

    viewPager.setAdapter(adapter);
}

public int getCurrentPage() {
    return viewPager.getCurrentItem();
}
}

FullScreenImageAdapter Class

public class FullScreenImageAdapter extends PagerAdapter {
private Activity _activity;
private LayoutInflater inflater;
private ArrayList<DataRecord> dataRecords;
public String info;



public FullScreenImageAdapter (Activity activity,
                               ArrayList<DataRecord> dataRecords) {
    this._activity = activity;
    this.dataRecords = dataRecords;
}

@Override
public int getCount() {
    return this.dataRecords.size();
}



@Override
public boolean isViewFromObject(View view, Object object) {
    return view == ((RelativeLayout) object);
}

@Override
public Object instantiateItem(final ViewGroup container, int position) {

    Button btn;
    TextView textField;

    inflater = (LayoutInflater) _activity
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View viewLayout = inflater.inflate(R.layout.main_screen, container,
            false);

    btn = (Button)  viewLayout.findViewById(R.id.button);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                Log.d("Info - ", info);
            }
            catch (ActivityNotFoundException e) {
                Log.d("Error", e.toString());
            }
        }
    });



    textField = (TextView) viewLayout.findViewById(R.id.text_field);
    info = dataRecords.get(position).information;
    textField.setText(info);

    ((ViewPager) container).addView(viewLayout);

    return viewLayout;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    ((ViewPager) container).removeView((RelativeLayout) object);

}
}

Solution

  • Use btn.setTag and v.getTag for getting clciked value for current Button:

    info = dataRecords.get(position).information;
    btn.setTag(info);
    

    and on button click get value back from Button:

    public void onClick(View v) {
                try {
                    Log.d("Info - ", (String)v.getTag());
                }
                catch (ActivityNotFoundException e) {
                    Log.d("Error", e.toString());
                }
            }