3

Я - разработчик андроид, и у меня возникают проблемы с динамическим обновлением заголовков/заголовков Jake Wharton's Viewpagerindicator. Я уже пробовал использовать notifyDataSetChanged() в экземпляре индикатора в методе onPageChangeListener и в рамках другого метода без успеха. Первоначально я устанавливал заголовки/заголовки через глобальную строку в OnCreate. Я попытался выполнить ответ от this SO вопрос без успеха. Любая помощь в решении этой проблемы очень ценится.Как динамически обновлять заголовки ViewPagerIndicator?

МОЙ КОД

OnCreate

chosenAilment = ""; 
    suggestedRemedy=""; 
    whichAilment=chosenAilment; 
    whichRemedy=suggestedRemedy; 
    whichArea="AREA OF DISCOMFORT"; 

    setContentView(R.layout.viewpagermain); 
    MyPagerAdapter adapter = new MyPagerAdapter(this); 
    pager = (ViewPager)findViewById(R.id.viewpager); 
    indicator = (TitlePageIndicator)findViewById(R.id.indicator); 
    pager.setAdapter(adapter); 
    indicator.setViewPager(pager); 
    indicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageSelected(int position) { 
      Crouton.makeText(RemedyActivity.this, "page changed", Style.INFO).show(); 
      if(position==0){ 
       whichAilment=""; 
       whichRemedy=""; 
       whichArea="AREA OF DISCOMFORT"; 
      }else if(position==1){ 
       whichAilment=chosenAilment; 
       whichRemedy=""; 
       whichArea=""; 
      }else if(position==2){ 
       whichAilment=""; 
       whichRemedy=suggestedRemedy; 
       whichArea=""; 
      } 
      indicator.notifyDataSetChanged(); 
     } 

Метод Update

public void updateMsg(String t_info, float t_x, float t_y, int t_c){ 
    //infoView.updateInfo(t_info, t_x, t_y, t_c); 
    popUpButton.setText(TouchView.touchInfo);  
    popUpButton.setX(t_x-(popUpButton.getWidth()/2)); 
    popUpButton.setY(t_y-(popUpButton.getHeight())); 

    Resources res = getResources(); 
     if(TouchView.touchInfo=="Arm"){ 
      ailmentsList = res.getStringArray(R.array.arm_ailments); 
      chosenAilment = "ARM AILMENTS"; 
     }else if(TouchView.touchInfo=="Leg"){ 
      ailmentsList = res.getStringArray(R.array.leg_ailments); 
      chosenAilment = "LEG AILMENTS"; 
     }else if(TouchView.touchInfo=="Back"){ 
      ailmentsList = res.getStringArray(R.array.back_ailments); 
      chosenAilment = "BACK AILMENTS"; 
     }else if(TouchView.touchInfo=="Groin"){ 
      if(isMale){ 
       ailmentsList = res.getStringArray(R.array.groin_ailments_male); 
       chosenAilment = "GROIN AILMENTS"; 
      }else{ 
       ailmentsList = res.getStringArray(R.array.groin_ailments_female); 
       chosenAilment = "GROIN AILMENTS"; 
      } 
     }else if(TouchView.touchInfo=="Chest"){ 
      if(isMale){ 
       ailmentsList = res.getStringArray(R.array.chest_ailments_male); 
       chosenAilment = "CHEST AILMENTS"; 
      }else{ 
       ailmentsList = res.getStringArray(R.array.chest_ailments_female); 
       chosenAilment = "CHEST AILMENTS"; 
      } 
     }else if(TouchView.touchInfo=="Abdomen"){ 
      if(isMale){ 
       ailmentsList = res.getStringArray(R.array.abdomen_ailments_male); 
       chosenAilment = "ABDOMEN AILMENTS"; 
      }else{ 
       ailmentsList = res.getStringArray(R.array.abdomen_ailments_female); 
       chosenAilment = "ABDOMEN AILMENTS"; 
      } 
     }else if(TouchView.touchInfo=="Head"){ 
      ailmentsList = res.getStringArray(R.array.head_ailments); 
      chosenAilment = "HEAD AILMENTS"; 
     }else if(TouchView.touchInfo=="Buttocks"){ 
      ailmentsList = res.getStringArray(R.array.buttocks_ailments); 
      chosenAilment = "BUTTOCKS AILMENTS"; 
     }else{ 
      ailmentsList = res.getStringArray(R.array.head_ailments); 
      chosenAilment = ""; 
     } 

    indicator.notifyDataSetChanged(); 
    } 

Пейджер адаптер

private class MyPagerAdapter extends PagerAdapter { 

    private String[] titles = new String[] {whichArea, whichAilment, whichRemedy }; 
    private final Context context; 
    private int[] scrollPosition = new int[titles.length]; 

    public MyPagerAdapter(Context context) 
    { 
     this.context = context; 
     for (int i = 0; i < titles.length; i++) 
     { 
      scrollPosition[i] = 0; 
     } 
    } 

    @Override 
    public String getPageTitle(int position) 
    { 
     return titles[position]; 
    } 

    @Override 
    public int getCount() 
    {    
     return titles.length; 
    } 

ответ

1

Основные вопросы, у вас есть с вашим адаптером пейджера и Обновит e метод. Вместо того, чтобы переписывать все это, я предлагаю вам использовать существующую библиотеку, например, this one или this one от Jake Wharton. Это сделает вашу жизнь намного проще и сделает именно то, что вы пытаетесь сделать.

Здесь приведено описание link to the turotial о том, как настроить Jake Wharton ViewPagerIndicator. Он содержит пример кода и пошаговые инструкции по его настройке. Просто измените учебник, чтобы удовлетворить ваши потребности.

В учебнике вы заметите, что они используют Array для хранения названий, которые будут отображаться для каждого вида. Заголовки в примере предварительно определены. Я заметил, что в вашем адаптере есть массив титров. Если это все, что вам нужно установить, используйте их. Если вы не знаете, какие фрагменты будут добавлены в ваш ViewPager заблаговременно, вы можете просто называть их, когда вы добавляете их в адаптер, например, используйте HashMap в качестве коллекции, которая поддерживает ваш адаптер так, как вы можете назвать каждый Fragment, поскольку он добавлен like in this example, а затем просто добавьте эти заголовки (их значения ключей из вашей хэш-карты) в список названий ViewPagerIndicator по мере их появления. (Просто получите фрагмент, который отображается и найдите его ключ в HasMap).

+0

Спасибо, что ответили. Я уже использую ViewPagerIndicator от Jake Wharton, и связанное с ним учебное пособие - это тот, который я использовал в качестве руководства для реализации моего viewpager. –

+0

Я не понимал, потому что ваш адаптер сильно отличается от того, который находится в учебнике. Например, вы не реализуете TitleProvider или другие методы в учебнике. Как я понимаю, адаптер/индикатор настроен на работу, так это то, что заголовки вытягиваются из массива титров. Это означает, что ваш подход при настройке textview не будет работать. Скорее, вам нужно будет добавить нужные заголовки в массив доступных заголовков, а затем установить их на основе отображаемого фрагмента. – Rarw

Смежные вопросы