ViewPager, FragmentStatePagerAdapter, ListFragment отдельные данные списка для каждого фрагмента - PullRequest
0 голосов
/ 27 марта 2012

У меня есть ViewPager с динамическим количеством страниц в нем.Каждую из этих страниц необходимо прочитать из БД и отобразить набор данных для этой страницы.

Я сравниваю заголовок текущей выбранной страницы с первым значением в базе данных "username", чтобы проверить, соответствуют ли данные этой странице.

Мои фрагменты, хотя и отображают данные неправильно.Я пытаюсь установить arrayAdapter в onCreateView, но он не вызывается при создании каждого фрагмента.В моем тестовом примере у меня есть три фрагмента, user1, user2, user3.onCreateView первоначально вызывается для user1, затем вызывается снова, только когда я проведу пальцем назад к user2, и никогда больше для user1 или user3.

Мне нужно иметь возможность установить arrayAdapter для каждого фрагмента специально, потому что каждый из них будетиметь другой массив значений для отображения.

PagerAdapter

   public class ExamplePagerAdapter extends FragmentStatePagerAdapter implements TitleProvider{

        private Map<Integer, UserFragment> mPageReferenceMap = new HashMap<Integer, UserFragment>();

        public ExamplePagerAdapter(FragmentManager fm) {
            super(fm);
        }

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

        @Override
        public Fragment getItem(int position) {
            Fragment fragment = new UserFragment();

            Bundle args = new Bundle();
            fragment.setArguments(args);        
            return fragment;
        }

        @Override
        public String getTitle(int pos) {
            return "@"+users[pos].getName();
        }

        @Override
        public void destroyItem(View container, int position, Object object) {              
            mPageReferenceMap.remove(Integer.valueOf(position));
        }
    }

UserFragment

public class UserFragment extends ListFragment {
      Context ctx;
      View v;
      Button mAddEntry;
      static int p; 
      static ArrayList<String> entryArray;

       @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            ctx = container.getContext();
            if (v != null) 
                return v;

            v = inflater.inflate(R.layout.user_fragment, container, false);
            mAddEntry = (Button) v.findViewById(R.id.entry_b);
            mAddEntry.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Bundle b = new Bundle();
                    b.putInt("pos", p);
                    Intent mi = new Intent(v.getContext(), EntryAdd.class);
                    mi.putExtras(b);
                    startActivity(mi);
                }
            });             
            updateUserFrag();
            return v;      
       }     

       public void updateUserFrag () {         
             entryArray = new ArrayList<String>();
             StringBuilder sb = new StringBuilder();
             final DBAdapter db = new DBAdapter(ctx);
             db.open();
             Cursor c = db.getAllEntries();
             try {
                while (c.moveToNext()) {
                    if (c.getString(0).equals(MainActivity.users[p].getName())) {
                        sb.append(c.getString(1));
                        entryArray.add(sb.toString());
                    }
                }
             } catch (Exception e) {}
             c.close();
             db.close();

             ArrayAdapter<String> a = new ArrayAdapter<String>(ctx, android.R.layout.simple_list_item_1, entryArray);
             setListAdapter(a);
       }

}

В основном, япросто нужен метод, который я могу использовать, чтобы дать каждому фрагменту свои данные при его создании.onCreateView () не вызывается для каждого фрагмента, так что это бесполезно для меня.

ОБНОВЛЕНИЕ Я думаю, что я почти получил его, но я не могу понять эту последнюю часть.Я использую метод TitlePageIndicators onPageSelected для отправки данных в мой обработчик фрагментов.

   TitlePageIndicator indicator = (TitlePageIndicator)findViewById(R.id.indicator);
    indicator.setViewPager(pager, 0);
    indicator.setOnPageChangeListener(new OnPageChangeListener() {
         @Override
         public void onPageSelected(int position) {
              Message msg = UserFragment.handy.obtainMessage(); 
              Bundle b = new Bundle(); 
              b.putInt("m", 0); 
              b.putInt("p", position); 
              b.putStringArrayList("e", updateUserFrag(position));
              msg.setData(b); 
              UserFragment.handy.handleMessage(msg);                 
         }

Обработчик

   static Handler handy = new Handler() { 
        public void handleMessage(Message msg) { 
            int p = msg.getData().getInt("p"); 
            int m = msg.getData().getInt("m"); 
            ArrayList<String> e = msg.getData().getStringArrayList("e");

            switch (m) { 
                case 0: 
                    Log.d("HANDLER", Integer.toString(p));
                    for (int i=0;i<e.size();i++) {
                        //Log.d("ENTRY", e.get(i));
                    }
                break; 
             } 
        } 
   }; 

Проблема в том, что к моменту вызова обработчика Arrayadapter уже был установлени я могу найти способ вызвать обновление этих данных.

1 Ответ

1 голос
/ 29 марта 2012
 @Override
     public void onPageSelected(int position) {
          Message msg = UserFragment.handy.obtainMessage(); 
          Bundle b = new Bundle(); 
          b.putInt("m", 0); 
          b.putInt("p", position); 
          b.putStringArrayList("e", updateUserFrag(position));
          msg.setData(b); 
          UserFragment.handy.handleMessage(msg);                 
     }

   public ArrayList<String> updateUserFrag (int p) {           
         entryArray = new ArrayList<String>();
         StringBuilder sb = new StringBuilder();
         DBAdapter db = new DBAdapter(this);
         db.open();
         Cursor c = db.getAllEntries();
         try {
            while (c.moveToNext()) {
                if (c.getString(0).equals(users[p].getName())) {
                    sb.append(c.getString(1));
                    entryArray.add(sb.toString());
                }
            }
         } catch (Exception e) {}
         c.close();
         db.close();
        return entryArray;           
   }

UserFragment

public class UserFragment extends ListFragment {
      Context ctx;
      View v;
      Button mAddEntry;
      static int p; 
      static ArrayList<String> entryArray;
      static ArrayAdapter<String> a;

       @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            ctx = container.getContext();
            if (v != null) 
                return v;

            v = inflater.inflate(R.layout.user_fragment, container, false);
            mAddEntry = (Button) v.findViewById(R.id.entry_b);
            mAddEntry.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Bundle b = new Bundle();
                    b.putInt("pos", p);
                    Intent mi = new Intent(v.getContext(), EntryAdd.class);
                    mi.putExtras(b);
                    startActivity(mi);
                }
            });    
            updateUserFrag(p);
            return v;      
       }     

       public void updateUserFrag (int p) {        
             entryArray = new ArrayList<String>();
             a = new ArrayAdapter<String>(ctx, android.R.layout.simple_list_item_1, entryArray);
             setListAdapter(a);
       }

       static Handler handy = new Handler() { 
            public void handleMessage(Message msg) { 
                int p = msg.getData().getInt("p"); 
                int m = msg.getData().getInt("m"); 
                ArrayList<String> e = msg.getData().getStringArrayList("e");

                switch (m) { 
                    case 0: 
                        Log.d("HANDLER", Integer.toString(p));
                        entryArray.clear();
                        for (int i=0;i<e.size();i++) {
                            entryArray.add(e.get(i));
                        }
                        a.notifyDataSetChanged();
                    break; 
                 } 
            } 
       };      
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...