Android: как изменить элементы, созданные с помощью ViewPager?

Я перестраиваю дизайн своего приложения и хотел бы использовать для него ViewPager. Реализация была не совсем проблемой, но я не могу понять, как изменить свои TextView внутри страниц. Мне тоже многочасовое гугление не помогло. Возможно ты можешь помочь мне. Мне просто нужно знать, как изменить текст, цвет текста и прочее в моих TextViews. main.xml включает мой ViewPager, а speiseplan.xml включает TextViews внутри ScrollView, каждый с идентификатором.

основной.xml:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <android.support.v4.view.ViewPager
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        android:id="@+id/awesomepager" />

</LinearLayout>

Я не буду писать здесь весь speiseplan.xml, так как он просто включает в себя ScrollView и кучу TextView.

Реализация на Java следующая:

public class Speiseplan extends Activity {

    private ViewPager myPager;
private static int NUM_VIEWS = 14;
private MyPagerAdapter myAdapter;

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

    myAdapter = new MyPagerAdapter();
    myPager = (ViewPager) findViewById(R.id.awesomepager);
    myPager.setAdapter(myAdapter);
}

private class MyPagerAdapter extends PagerAdapter{

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return NUM_VIEWS;
        }


        @Override
        public Object instantiateItem(View collection, int position){
            LayoutInflater inflater = (LayoutInflater) collection.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            View view = inflater.inflate(R.layout.speiseplan, null);

            ((ViewPager) collection).addView(view, 0);

            return view;
        }

        @Override
        public void destroyItem(View arg0, int arg1, Object arg2){
            ((ViewPager) arg0).removeView((View) arg2);
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            // TODO Auto-generated method stub
            return arg0 == ((View) arg1);
        }

    @Override
    public Parcelable saveState() {
        return null;
    }

}
}

Теперь, как я могу получить доступ к своим TextViews и изменить их. И как я могу обнаружить, что пользователь переходит на другую страницу.

Спасибо за помощь!


person TheBrillowable    schedule 25.12.2011    source источник


Ответы (1)


Я думаю, вам придется изменить TextViews в методе instantiateItem(). Он работает почти так же, как метод getView() в других адаптерах.

PagerAdapter не перезапускает представления автоматически, как другие адаптеры, такие как BaseAdapter или ArrayAdapter. Возможно, вы захотите реализовать переработку самостоятельно. Взгляните на документацию, в которой даны некоторые советы по как это сделать.

Чтобы обнаружить перелистывание, вы можете использовать OnPageChangeListener. интерфейс.

person Kaloer    schedule 25.12.2011
comment
Почему-то я не могу заставить его работать. Я просто не могу получить доступ к TextViews, которые я определил в своем макете. Может быть, вы могли бы предоставить мне пример кода? - person TheBrillowable; 25.12.2011
comment
Хм .. Вы должны иметь возможность вызывать «view.findViewById ()» с вашими идентификаторами TextView, объявленными в вашем XML-файле. Что именно вы имеете в виду, не имея доступа к TextViews? - person Kaloer; 26.12.2011
comment
Когда я вызываю их, как вы сказали, кажется, что назначение переменной работает, но я не могу изменить текст или что-то вроде того, что я обычно делаю. - person TheBrillowable; 26.12.2011
comment
Странный. Вы делаете то же самое, что и в этом ответе? Вы также можете изменить инициализацию LayoutInflator примерно так: [...] = LayoutInflator.from(Speiseplan.this). Я не уверен, что это сделает что-то другое, но, по крайней мере, это немного проще, чем ваш текущий способ сделать это. - person Kaloer; 26.12.2011
comment
Хорошо, изменение текста внутри метода instanceItem() теперь работает, большое спасибо. Я попробую заставить его работать как-нибудь. - person TheBrillowable; 01.01.2012