我有一个包含三个标签的活动,每当我尝试更改活动中标签布局的位置时,如果我点击位于第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)
答案 0 :(得分:1)
将你的getItemCount()更新为....
@Override
public int getItemCount() {
return mlistMovies == null ? 0 : mlistMovies.length;
}