2016-01-15 106 views
0

我有一個有三個選項卡的活動,每當我嘗試更改活動中選項卡布局的位置時,如果單擊最後一個選項卡位置爲2,則會出現錯誤。請幫助。如何更改我的活動中選項卡布局的位置?

package comeagain.materialdesign.activities; 

import android.content.ComponentName; 
import android.content.Intent; 
import android.graphics.drawable.Drawable; 
import android.os.Bundle; 
import android.os.PersistableBundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.app.FragmentStatePagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.text.SpannableString; 
import android.text.Spanned; 
import android.text.style.ImageSpan; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.Window; 
import android.widget.ImageView; 
import android.widget.Toast; 

import com.oguzdev.circularfloatingactionmenu.library.FloatingActionButton; 
import com.oguzdev.circularfloatingactionmenu.library.FloatingActionMenu; 
import com.oguzdev.circularfloatingactionmenu.library.SubActionButton; 

import android.os.Handler; 

import comeagain.materialdesign.Log.L; 
import comeagain.materialdesign.Service.MyService; 
import comeagain.materialdesign.extras.SortListener; 
import comeagain.materialdesign.fragments.FragmentBoxOffice; 
import comeagain.materialdesign.fragments.FragmentSearch; 
import comeagain.materialdesign.fragments.FragmentUpcoming; 
import comeagain.materialdesign.fragments.MyFragment; 
import comeagain.materialdesign.fragments.NavigationDrawerFragment; 
import comeagain.materialdesign.R; 
import comeagain.materialdesign.views.SlidingTabLayout; 
import it.neokree.materialtabs.MaterialTab; 
import it.neokree.materialtabs.MaterialTabHost; 
import it.neokree.materialtabs.MaterialTabListener; 
import me.tatarka.support.job.JobInfo; 
import me.tatarka.support.job.JobScheduler; 

public class MainActivity extends AppCompatActivity implements MaterialTabListener, View.OnClickListener { 

    private static final int JOB_ID = 100; 
    private Toolbar toolbar; 
    private ViewPager mPager; 
    private MaterialTabHost mTabHost; 
    private SlidingTabLayout mTabs; 
    private ViewPagerAdapter adapter; 
    private ViewGroup mCointainerTooobar; 

    public static final int MOVIEE_HITS =0; 
    public static final int MOVIES_SEARCH_RESULTS = 2; 
    public static final int MOVIES_UPCOMING = 1; 
    public static final int TAB_COUNT = 3; 
    private JobScheduler mJobScheduler; 
    private static final long POLL_FREQUENCY = 28800000; 

    private static final String TAG_SORT_NAME = "sortName"; 
    private static final String TAG_SORT_DATE = "sortDate"; 
    private static final String TAG_SORT_RATINGS = "sortRatings"; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     getWindow().requestFeature(Window.FEATURE_ACTION_BAR); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     buildFAB(); 
     setUpTabs(); 
     setupJob(); 
     setUpDrawer(); 

    } 

    public void onDrawerItemClicked(int index){ 
     mPager.setCurrentItem(index); 

    } 
    public View getContainerToolbar(){ 
     return mCointainerTooobar; 
    } 
    public void setUpDrawer() { 

     toolbar = (Toolbar) findViewById(R.id.app_bar); 
     setSupportActionBar(toolbar); 
/* 
getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
*/ 
     NavigationDrawerFragment drawerFragment = (NavigationDrawerFragment) 
       getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer); 
     drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), toolbar); 
    } 

    public void setUpTabs() { 
     mPager = (ViewPager) findViewById(R.id.pager); 

     mTabHost = (MaterialTabHost) findViewById(R.id.materialTabHost); 
     adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
     mPager.setAdapter(adapter); 
     mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       mTabHost.setSelectedNavigationItem(position); 
      } 
     }); 
     for (int i = 0; i < adapter.getCount(); i++) { 
      mTabHost.addTab(
        mTabHost.newTab() 
          .setIcon(adapter.getIcon(i)) 
          .setTabListener(this) 
      ); 
     } 


    } 

    public void setupJob() { 
     mJobScheduler = JobScheduler.getInstance(this); 
     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       constructJob(); 
      } 
     }, 30000); 


    } 

    public void constructJob() { 
     JobInfo.Builder builder = new JobInfo.Builder(JOB_ID, new ComponentName(this, MyService.class)); 
     builder.setPeriodic(POLL_FREQUENCY) 
       .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) 
       .setPersisted(true); 
     mJobScheduler.schedule(builder.build()); 

    } 

    private void buildFAB() { 
     // in Activity Context 
     ImageView icon = new ImageView(this); // Create an icon 
     icon.setImageResource(R.drawable.ic_action_new); 
     FloatingActionButton actionButton = new FloatingActionButton.Builder(this) 
       .setContentView(icon) 
       .setBackgroundDrawable(R.drawable.selector_button_red) 
       .build(); 

// repeat many times: 
     ImageView iconSortName = new ImageView(this); 
     iconSortName.setImageResource(R.drawable.ic_action_alphabets); 
     ImageView iconSortDate = new ImageView(this); 
     iconSortDate.setImageResource(R.drawable.ic_action_calendar); 
     ImageView iconSortRatings = new ImageView(this); 
     iconSortRatings.setImageResource(R.drawable.ic_action_important); 

     // set background for all the buttons 
     SubActionButton.Builder itemBuilder = new SubActionButton.Builder(this); 
     itemBuilder.setBackgroundDrawable(getResources().getDrawable(R.drawable.selector_sub_button_gray)); 

     // build the sub buttons 
     SubActionButton buttonSortName = itemBuilder.setContentView(iconSortName).build(); 
     SubActionButton buttonSortDate = itemBuilder.setContentView(iconSortDate).build(); 
     SubActionButton buttonSortRatings = itemBuilder.setContentView(iconSortRatings).build(); 

     buttonSortName.setTag(TAG_SORT_NAME); 
     buttonSortDate.setTag(TAG_SORT_DATE); 
     buttonSortRatings.setTag(TAG_SORT_RATINGS); 

     buttonSortName.setOnClickListener(this); 
     buttonSortDate.setOnClickListener(this); 
     buttonSortRatings.setOnClickListener(this); 
     //Add the sub buttons to the main floating action button 
     FloatingActionMenu actionMenu = new FloatingActionMenu.Builder(this) 
       .addSubActionView(buttonSortName) 
       .addSubActionView(buttonSortDate) 
       .addSubActionView(buttonSortRatings) 

         // ... 
       .attachTo(actionButton) 
       .build(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      Toast.makeText(this, "Hey you just hit " + item.getTitle(), Toast.LENGTH_SHORT).show(); 
      return true; 
     } 

     if (id == R.id.Navigation) { 
      Intent intent = new Intent(this, Sub_Activity.class); 
      startActivity(intent); 
      return true; 
     } 
     if (id == R.id.TabsWithLibrary) { 
      startActivity(new Intent(this, ActivityUsingTabLibrary.class)); 
      return true; 
     } 
     if (id == R.id.VectorTest) { 
      startActivity(new Intent(this, VectorTestActivity.class)); 
      return true; 
     } 

     return onOptionsItemSelected(item); 
    } 

    @Override 
    public void onTabSelected(MaterialTab tab) { 
     mPager.setCurrentItem(tab.getPosition()); 

    } 

    @Override 
    public void onTabReselected(MaterialTab tab) { 

    } 

    @Override 
    public void onTabUnselected(MaterialTab tab) { 

    } 

    @Override 
    public void onClick(View v) { 
     //call instantiate item since getItem may return null depending on whether the PagerAdapter is of type FragmentPagerAdapter or FragmentStatePagerAdapter 
     Fragment fragment = (Fragment) adapter.instantiateItem(mPager, mPager.getCurrentItem()); 
     if (fragment instanceof SortListener) { 

      if (v.getTag().equals(TAG_SORT_NAME)) { 
       //call the sort by name method on any Fragment that implements sortlistener 
       ((SortListener) fragment).onSortByName(); 
      } 
      if (v.getTag().equals(TAG_SORT_DATE)) { 
       //call the sort by date method on any Fragment that implements sortlistener 
       ((SortListener) fragment).onSortByDate(); 
      } 
      if (v.getTag().equals(TAG_SORT_RATINGS)) { 
       //call the sort by ratings method on any Fragment that implements sortlistener 
       ((SortListener) fragment).onSortByRatings(); 
      } 
     } 
    } 


    class ViewPagerAdapter extends FragmentStatePagerAdapter { 
     /*private String tabs[] = new String[]{"Tab 1 ", "Tab 2 ", " Tab 3"};*/ 
     int icons[] = {R.drawable.ic_action_trending_orange, 
       R.drawable.ic_action_upcoming_orange, 
       R.drawable.ic_action_search_orange, 

     }; 

     /*String[] tabText = getResources().getStringArray(R.array.tabs);*/ 
     FragmentManager fragmentManager; 

     public ViewPagerAdapter(FragmentManager fm) { 
      super(fm); 
      fragmentManager = fm; 
     } 


     @Override 
     public Fragment getItem(int num) { 
      Fragment fragment = null; 
      switch (num) { 
       case MOVIEE_HITS: 
        fragment = FragmentBoxOffice.newInstance("", ""); 

        break; 
       case MOVIES_UPCOMING: 
        fragment = FragmentUpcoming.newInstance("", ""); 

        break; 
       case MOVIES_SEARCH_RESULTS: 
        fragment = FragmentSearch.newInstance("", ""); 

        break; 

      } 
      return fragment; 
     } 


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

     @Override 

     public CharSequence getPageTitle(int position) { 
      return getResources().getStringArray(R.array.tabs)[position]; 
     } 

     private Drawable getIcon(int position) { 
      return getResources().getDrawable(icons[position]); 
     } 
    } 


} 

Adapter.classs

package comeagain.materialdesign.adapters; 

import android.content.Context; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.animation.Animation; 
import android.view.animation.AnimationUtils; 
import android.widget.ImageView; 
import android.widget.RatingBar; 
import android.widget.TextView; 

import com.android.volley.VolleyError; 
import com.android.volley.toolbox.ImageLoader; 

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Date; 

import comeagain.materialdesign.R; 
import comeagain.materialdesign.extras.Constants; 
import comeagain.materialdesign.network.VolleySingleton; 
import comeagain.materialdesign.pojo.Movie; 

/** 
* Created by Macharia on 1/9/2016. 
*/ 
public class AdapterBoxOffice extends RecyclerView.Adapter<AdapterBoxOffice.ViewHolderBoxOffice> { 
    private LayoutInflater layoutInflater; 
    private ArrayList<Movie> mlistMovies = new ArrayList<>(); 
    private VolleySingleton volleySingleton; 
    private ImageLoader imageLoader; 
    private DateFormat dateFormat = new SimpleDateFormat("yyy-MM-dd"); 
    private int previousPosition=0; 

    public AdapterBoxOffice(Context context) { 
     layoutInflater = LayoutInflater.from(context); 
     volleySingleton = VolleySingleton.getsInstance(); 
     imageLoader = volleySingleton.getImageLoader(); 
    } 

    public void setMovieList(ArrayList<Movie> listMovies) { 
     this.mlistMovies = listMovies; 

     notifyDataSetChanged(); 
    } 

    @Override 
    public ViewHolderBoxOffice onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = layoutInflater.inflate(R.layout.custom_movie_box_office, parent, false); 
     ViewHolderBoxOffice viewHolder = new ViewHolderBoxOffice(view); 

     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolderBoxOffice holder, int position) { 
     Movie currentMovie = mlistMovies.get(position); 
     holder.movieTitle.setText(currentMovie.getTitle()); 
     Date movieReleaseDate = currentMovie.getReleaseDateTheater(); 
     if (movieReleaseDate != null) { 
      String formmattedDate = dateFormat.format(movieReleaseDate); 
      holder.movieReleaseDate.setText(formmattedDate); 
     } else { 
      holder.movieReleaseDate.setText(Constants.NA); 

     } 
     int audienceScore=currentMovie.getAudienceScore(); 
     if (audienceScore==-1){ 
      holder.movieAudienceScore.setRating(0.0F); 
      holder.movieAudienceScore.setAlpha(0.5F); 
     } 
     else 
     { 
      holder.movieAudienceScore.setRating(currentMovie.getAudienceScore()/20.0F); 
      holder.movieAudienceScore.setAlpha(1.0F); 
     } 
     if(position>previousPosition) 
     { 
      comeagain.materialdesign.anim.AnimationUtils.animate(holder, true); 

     }else { 
      comeagain.materialdesign.anim.AnimationUtils.animate(holder, false); 

     } 
     previousPosition=position; 

     String urlThumnail = currentMovie.getUrlThumbnail(); 
     loadImages(urlThumnail, holder); 
    } 

    private void loadImages(String urlThumbnail, final ViewHolderBoxOffice holder) { 
     if (urlThumbnail != null) { 
      imageLoader.get(urlThumbnail, new ImageLoader.ImageListener() { 
       @Override 
       public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) { 
        holder.movieThumbnail.setImageBitmap(response.getBitmap()); 
       } 

       @Override 
       public void onErrorResponse(VolleyError error) { 

       } 
      }); 
     } 
    } 


    @Override 
    public int getItemCount() { 
     return mlistMovies.size(); 
    } 

    static class ViewHolderBoxOffice extends RecyclerView.ViewHolder { 
     private ImageView movieThumbnail; 
     private TextView movieTitle; 
     private TextView movieReleaseDate; 
     private RatingBar movieAudienceScore; 

     public ViewHolderBoxOffice(View itemView) { 
      super(itemView); 
      movieThumbnail = (ImageView) itemView.findViewById(R.id.movieThumbnail); 
      movieTitle = (TextView) itemView.findViewById(R.id.movieTitle); 
      movieReleaseDate = (TextView) itemView.findViewById(R.id.movieReleaseDate); 
      movieAudienceScore = (RatingBar) itemView.findViewById(R.id.movieAudienceScore); 
     } 
    } 
} 

我的應用程序衝突,有一次我嘗試從我的最後一個選項卡瀏覽到其他選項卡。以下是錯誤..

01-15 18:21:14.602 4250-4250/comeagain.materialdesign E/AndroidRuntime: FATAL EXCEPTION: main 
                    Process: comeagain.materialdesign, PID: 4250 
                    java.lang.NullPointerException 
                     at comeagain.materialdesign.adapters.AdapterBoxOffice.getItemCount(AdapterBoxOffice.java:113) 
                     at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:2556) 
                     at android.view.View.measure(View.java:16677) 
                     at android.support.v4.widget.SwipeRefreshLayout.onMeasure(SwipeRefreshLayout.java:600) 
                     at android.view.View.measure(View.java:16677) 
                     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5286) 
                     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 

回答

1

更新您的getItemCount()這個....

@Override 
public int getItemCount() { 
    return mlistMovies == null ? 0 : mlistMovies.length; 
} 
+0

作品,但是,在我的第一個選項卡中的內容消失,一旦我導航從我的最後一個標籤了。我必須再次刷新。如何解決這個問題? I –

+0

不確定,但您可以將其用作參考yourList.scrollToPosition(yourList.getAdapter()。getItemCount() - 1); – Nik

相關問題