Как обновить текущий вид в ViewPager - PullRequest
4 голосов
/ 26 декабря 2011

Я использую ViewPager с представлениями V1, V2, V3 ..... Я пытаюсь установить видимость LinearLayout, используемого в каждом представлении, нажав кнопку.С помощью этого кода он применяет изменения к следующему представлению вместо текущего представления.например я на V5.Когда я нажимаю, он скрывает / показывает объект на V6.Если я возвращаюсь с V6 к V5, то применяется изменение к V4.

Вот код:

public class FragmentStatePagerSupport extends FragmentActivity {
    static final int NUM_ITEMS = 10;
    MyAdapter mAdapter;
    ViewPager mPager;
    static int mNum;

    private Button btn_zoom;
    static LinearLayout LL_Head;

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

        mAdapter = new MyAdapter(getSupportFragmentManager());

        mPager = (ViewPager)findViewById(R.id.pager);
        mPager.setAdapter(mAdapter);
        mPager.setCurrentItem(5);

        btn_zoom = (Button)findViewById(R.id.btn_zoom);
    btn_zoom.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) {
                if (LL_Head.getVisibility() == View.VISIBLE) {
                    LL_Head.setVisibility(View.GONE);
                }else{
                    LL_Head.setVisibility(View.VISIBLE);
                }
            }
        });

.
.
.


    }

    public static class MyAdapter extends FragmentStatePagerAdapter {
        public MyAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public int getCount() {
            return NUM_ITEMS;
        }

        @Override
        public Fragment getItem(int position) {
            return ArrayListFragment.newInstance(position);
        }
    }

    public static class ArrayListFragment extends ListFragment {
        static ArrayListFragment newInstance(int num) {
            ArrayListFragment f = new ArrayListFragment();
            Bundle args = new Bundle();
            args.putInt("num", num);
            f.setArguments(args);
            return f;
        }

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mNum = getArguments() != null ? getArguments().getInt("num") : 1;
        }


        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.sura_vpager, container, false);

            TextView tv1=(TextView) v.findViewById(R.id.txtHead); 
            tv1.setText("Fragment #" + mNum);

            LL_Head = (LinearLayout)v.findViewById(R.id.LL_Head);

            return v;
        }

Пожалуйста, сообщите Спасибо

Ответы [ 2 ]

3 голосов
/ 02 января 2012

Для удобства пользования ViewPager загружает не только вид, который вы сейчас просматриваете, но и смежные виды.Это означает, что если вы прокручиваете из положения 0 в положение 1, то, что на самом деле происходит, это то, что позиция 2 загружена, поэтому она будет готова, когда вы прокрутите дальше.Вот почему изменение применяется к «следующему» представлению, а не к текущему (если вы прокрутите от представления 2 до 1, то будет создано представление 0).

Поскольку вы устанавливаете статическое значение LinearLayout в OnCreate, то изменяется только последний созданный вид - и это будет только тот, который вы просматриваете, если прокрутить до концапейджерВместо этого вы должны отслеживать, какой фрагмент просматривает пользователь (ViewPager.setOnPageChangeListener ()), и кэшировать фрагмент в своем адаптере.Затем вы знаете, какая позиция фрагмента вам нужна, и когда вы ее попросите, вы просто вернете ту, которую создали ранее (не создавайте новую, тогда она не будет работать:)).

Или версия tl; dr: LL_Head почти всегда устанавливается следующим фрагментом, а не текущим.Не устанавливайте это статически.Кэшируйте его в своем PagerAdapter и перезапускайте, когда вам это нужно.

Редактировать: В качестве альтернативы вы можете захотеть, чтобы фрагменты прослушивали какое-то событие, которое говорит им, должны ли они отображать или скрывать макет, о котором идет речь.В противном случае это будет влиять только на текущий фрагмент, а не на все фрагменты.

0 голосов
/ 26 декабря 2011

Нумерация в Java начинается с 0. Таким образом, когда вы хотите установить 5-й элемент, вы должны вызвать mPager.setCurrentItem (4);

Надеюсь, это поможет!

...