2012-08-09 88 views
1

我有一个activitybarsherlock TabsNavigation(3个选项卡)的活动,当我按下一个选项卡时,我改变相应片段的viewpager适配器。它工作正常,当我点击除第一个创建的另一个选项卡时,第一个页面始终是第一个选项卡中的一个。我试图在更改适配器之前放置invalidate(),但它不起作用。任何人有任何想法?这里是代码:Viewpager适配器不改变视图

public class Tabsteste2 extends SherlockFragmentActivity implements TabListener { 


static AdapterOpiniao mOdapter; 
static AdapterDados mDdapter; 
static AdapterFoto mFdapter; 
Bundle extras; 
JSONParser jsonParser = new JSONParser(); 
SharedPreferences mPrefs; 

static ViewPager mPager; 
static int countopiniao; 
static int countdados; 
static int countfoto; 
JSONArray perguntas = null; 
PageIndicator mIndicator; 
static ArrayList<HashMap<String, String>> opiniaolist; 
static ArrayList<HashMap<String, String>> dadoslist; 
static ArrayList<HashMap<String, String>> fotolist; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_tabsteste2); 
    opiniaolist = new ArrayList<HashMap<String, String>>(); 
    dadoslist = new ArrayList<HashMap<String, String>>(); 
    fotolist = new ArrayList<HashMap<String, String>>(); 
    mPager = (ViewPager)findViewById(R.id.pager); 
    extras = getIntent().getExtras(); 

    Boolean opiniaoflag = extras.getBoolean("opiniaoflag"); 
    Boolean dadosflag = extras.getBoolean("dadosflag"); 
    Boolean fotoflag = extras.getBoolean("fotoflag"); 
    countdados= extras.getInt("countdados"); 
    countopiniao=extras.getInt("countopiniao"); 
    countfoto=extras.getInt("countfoto"); 
    mPrefs = getSharedPreferences("mPrefs1",MODE_PRIVATE); 
    Log.d("countdados",""+countdados); 
    Log.d("countfoto",""+countfoto); 
    Log.d("countopiniao",""+countopiniao); 

getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    if(opiniaoflag==true){ 
    ActionBar.Tab opiniaotab = getSupportActionBar().newTab(); 
    opiniaotab.setText("Opinião"); 
    opiniaotab.setTag("op"); 
    opiniaotab.setTabListener(this); 
    mOdapter = new AdapterOpiniao(getSupportFragmentManager()); 
    Log.d("Opiniao",""+opiniaotab.getTag()); 
    getSupportActionBar().addTab(opiniaotab); 
    }if(dadosflag == true){ 
    ActionBar.Tab dadostab = getSupportActionBar().newTab(); 
    dadostab.setText("Dados"); 
    dadostab.setTag("dd"); 

    mDdapter = new AdapterDados(getSupportFragmentManager()); 
    dadostab.setTabListener(this); 
    Log.d("Dados",""+dadostab.getTag()); 
    getSupportActionBar().addTab(dadostab); 
    } 
// mDdapter = new AdapterDados(getSupportFragmentManager()); 
    if(fotoflag==true){ 
    ActionBar.Tab fotostab = getSupportActionBar().newTab(); 
    fotostab.setText("Fotos"); 
    fotostab.setTag("ft");   
    mFdapter = new AdapterFoto(getSupportFragmentManager()); 
    fotostab.setTabListener(this); 
    Log.d("Foto",""+fotostab.getTag()); 
    getSupportActionBar().addTab(fotostab); 
    } 


    new getpergunta().execute(); 


} 
@Override 
public void onTabReselected(Tab tab, FragmentTransaction transaction) { 
} 

@Override 
public void onTabSelected(Tab tab, FragmentTransaction transaction) { 
if(tab.getTag().equals("op")){ 
    mPager.invalidate(); 
    mPager.setAdapter(mOdapter); 
    mIndicator = (UnderlinePageIndicator)findViewById(R.id.indicator); 
    mIndicator.setViewPager(mPager); 

}else if (tab.getTag().equals("dd")){ 
    mPager.invalidate(); 
    mPager.setAdapter(mDdapter); 
    mIndicator = (UnderlinePageIndicator)findViewById(R.id.indicator); 
    mIndicator.setViewPager(mPager); 
    }else if(tab.getTag().equals("ft")){ 
     mPager.invalidate(); 
     mPager.setAdapter(mFdapter); 
     mIndicator = (UnderlinePageIndicator)findViewById(R.id.indicator); 
     mIndicator.setViewPager(mPager); 
    } 
} 


@Override 
public void onTabUnselected(Tab tab, FragmentTransaction transaction) { 
} 
public static class AdapterOpiniao extends FragmentPagerAdapter { 
    public AdapterOpiniao(FragmentManager fm) { 
     super(fm); 
    } 

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

    @Override 
    public Fragment getItem(int position) { 
     return FragmentOpinioes.newInstance(position); 
    } 
} 
public static class AdapterDados extends FragmentPagerAdapter { 
    public AdapterDados(FragmentManager fm) { 
     super(fm); 
    } 
    @Override 
    public int getCount() { 
     return countdados; 
    } 
    @Override 
    public Fragment getItem(int position) { 
     return FragmentDados.newInstance(position); 
    } 
} 
public static class AdapterFoto extends FragmentPagerAdapter { 
    public AdapterFoto(FragmentManager fm) { 
     super(fm); 
    } 
    @Override 
    public int getCount() { 
     return countfoto; 
    } 
    @Override 
    public Fragment getItem(int position) { 
     return FragmentFotos.newInstance(position); 
    } 
} 
+0

尝试: @覆盖 公众诠释getItemPosition(Object对象) { 回报PagerAdapter.POSITION_NONE; } – sherpya 2012-08-13 01:00:58

回答

1

为了解决你的情况,我用:

@Override 
public void onTabSelected(Tab tab, FragmentTransaction transaction) { 
    this.mPager.setCurrentItem(tab.getPosition()); 
} 

当选项卡上的点击,相应的选项卡的视图自动改变。

编辑︰我必须承认,我有一些困难,真正理解你的代码和你想做什么,所以我添加更多的代码来解释我认为你需要什么。

在我optinion,只有一个适配器是必要的ViewPager,然后如果我是正确的,你会这么做:

// I took some personal code for my example 
private ViewPager mPager; 
private PageIndicator mIndicator; 
private TabsExampleSectionsAdapter mAdapter; 

// Inside the onCreate method 
this.mPager = (ViewPager) findViewById(R.id.pager); 
this.mIndicator = new TabPageIndicator(this); 
this.mAdapter = new TabsExampleSectionsAdapter(this.getSupportFragmentManager()); 

this.mPager.setAdapter(this.mAdapter); 
this.mIndicator.setViewPager(this.mPager); 

当一切都被初始化,这是如何建立的标签和寻呼机观看说明(两者是相关的)。另外,不介意Section类,它是一个自定义数据模型对象,它包含您需要的标记数据,但它与actionbarsherlock无关。

private void buildTabs(Section[] sections) { 

    if (sections != null) { 

     for (Section section : sections) { 

      ActionBar.Tab sectionTab = getSupportActionBar().newTab(); 
      sectionTab.setText(section.name); 
      sectionTab.setTabListener(this); 
      getSupportActionBar().addTab(sectionTab); 

      // The tag ("op" or "dd" in your case for example) is contained somewhere in the section object 
      this.mAdapter.getSections().add(section); 
     } 
    } 
} 

最后,这是视图寻呼机适配器。它会选择返回下面你为每个标签位置定义的变量什么类型的片段:

public class TabsExampleSectionsAdapter extends FragmentPagerAdapter { 

    private ArrayList<Section> mSectionsList = new ArrayList<Section>(); 

    public TabsExampleSectionsAdapter(FragmentManager fragmentManager) { 
     super(fragmentManager); 
    } 

    @Override 
    public Fragment getItem(int position) { 

      // Retrieving the cooresponding tag of position 
      Section section = this.mSectionsList.get(position % getCount()); 

      // Here, you check the tag to know what type of fragment you must return 
      if (section.getTag().equals("dd")) { 
       return FragmentDados.newInstance(position); 
      } else if (section.getTag.equals("op")) { 
       return FragmentOp.newInstance(position); 
      } 
    } 

    @Override 
    public int getCount() { 
     return this.mSectionsList.size(); 
    } 

    @Override 
     public CharSequence getPageTitle(int position) { 
     return this.mSectionsList.get(position % getCount()).name.toUpperCase(); 
    } 

    public ArrayList<Section> getSections() { 
     return this.mSectionsList; 
    } 
} 

总之,当一切都成立,改变的意见并不必须通过改变适配器和调用手动完成无效()。您可以使用简单条件从适配器返回不同类型的碎片。然后,通过调用:

this.mPager.setCurrentItem(position); 

它通过传递适配器的getItem(position)方法自动更改当前视图。基本上,你只需要协调你的标签位置和你的标签,以获得正确类型的片段。

随时索取更多详情。