user4660280
user4660280

Reputation:

How can I find out which image is the current one in a ViewPager?

I'm fairly new to Android programming, and I'm trying to design an app where when I swipe through several images on a ViewPager that takes up some of the screen, other elements of that same activity/screen will change with it without necessarily 'scrolling' horizontally like the ViewPager does. My problem is that I can't find a way to identify which image in the ViewPager is the 'current' one outside of the ViewPager.

I tried to create a getter for grabbing the position from instantiateItem method, but no luck - because I assume it simply creates everything once, not updating it again, so when I swipe nothing will happen. Also, I realize that my dieValue variable doesn't do anything - but it's meant to serve as an example of what I want to accomplish. The dieValue variable would change based on which image was the current one.

CustomSwipeAdapter.java

public class CustomSwipeAdapter extends PagerAdapter {

    private Context ctx;
    public int[] image_resources = {R.drawable.d20, R.drawable.d8, R.drawable.d6};

    public CustomSwipeAdapter(Context ctx) {

        this.ctx = ctx;
    }

    @Override
    public int getCount() {

        return image_resources.length;
    }

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

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        LayoutInflater layoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View item_view = layoutInflater.inflate(R.layout.swipe_layout, container, false);

        ImageView imageView = (ImageView) item_view.findViewById(R.id.dieImageView);
        imageView.setImageResource(image_resources[position]);

        TextView textView = (TextView) item_view.findViewById(R.id.dieValueTop);
        if (position == 0) { textView.setText(R.string.d20Label); }
        if (position == 1) { textView.setText(R.string.d8Label); }
        if (position == 2) { textView.setText(R.string.d6Label); }

        container.addView(item_view);
        return item_view;
    }

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

DiceRollerActivity.java

public class DiceRollerActivity extends Activity implements View.OnClickListener {

    ViewPager viewPager;
    CustomSwipeAdapter adapter;
    private int dieValue;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dice_roller);

        viewPager = (ViewPager) findViewById(R.id.dieViewPager);
        adapter = new CustomSwipeAdapter(this);
        viewPager.setAdapter(adapter);

        Button RollDieButton = (Button) findViewById(R.id.rollDieButton);
        RollDieButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.rollDieButton:
                Random rand = new Random();
                int random = rand.nextInt(dieValue) + 1;
                setDieResults(random);
        }
    }

    // Prints the results of the die roll to the results log
    private void setDieResults(int random) {
        TextView dieResults = (TextView) findViewById(R.id.dieResultsLabel);

        if (random == dieValue) {
            dieResults.setText(getString(R.string.YouRolledLabel) + random + getString(R.string.criticalHit));
        } else if (random == dieValue) {
            dieResults.setText(getString(R.string.YouRolledLabel) + random + getString(R.string.criticalMiss));
        }else{
            dieResults.setText(getString(R.string.YouRolledLabel) + random);
        }
    }
}

Upvotes: 1

Views: 1594

Answers (2)

Gueorgui Obregon
Gueorgui Obregon

Reputation: 5087

Create a method inside your CustomSwipeAdapter

 public int getCurrentImageResource(int currentPosition){
     return image_resources[currentPosition];
 }

To access to the current image call this method passing current position with viewPager.getCurrentItem() like this

adapter.getCurrentImageResource(viewPager.getCurrentItem());

Hope this helps!

Upvotes: 1

lpisc
lpisc

Reputation: 1

You could use

viewPager.getCurrentItem();

on your DiceRollerActivity.class to get the current position.

Then, to get the image a better approach would be to have the image array on your DiceRollerActivity.class and pass it onto the CustomSwipeAdapter constructor.

Upvotes: 0

Related Questions