简体   繁体   中英

Strange behavior of OnItemClickListener inside RecyclerView inside Fragment

Need help with android app (java)
My app starts with SplashActivity. During it I`m getting json via retrofit request and after successfull response I fill my DB

SplashActivity

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    ISplashInteractor splashInteractor = new SplashInteractor();
    moviePresenter = new MoviePresenter(this, splashInteractor);
    moviePresenter.initDB();
}

after DB successfully loaded automatically starts MovieListActivity

public class MovieListActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_movie_list);
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    Fragment allMoviesFragment = new AllMoviesFragment();
    String tag = "MovieList";
    transaction.replace(R.id.main_container, allMoviesFragment, tag);
    transaction.commit();
}

}

and at once list of movies loads inside inner fragment AllMoviesFragment(inside recyclerView). till this point everything is ok.
now I set onRecyclerViewItemClickListener - it must open another fragment inside MovieListActivity but instead of this - my app restarts from begining and I observe loading of SpalshActivity again(I put progressbar during request) and again my RecyclerView...

my RecyclerViewAdapter

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
    private List<MovieDetails> movieList;
    private OnRecyclerViewItemClickListener onRecyclerViewItemClickListener;

public RecyclerViewAdapter(List<MovieDetails> movieList) {
    this.movieList = movieList;
}

public void setOnRecyclerViewItemClickListener(OnRecyclerViewItemClickListener onRecyclerViewItemClickListener){
    this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.simple_selectable_list_item, parent, false);
    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    MovieDetails movieDetails = (movieList.get(position));
    holder.name.setText(movieDetails.getTitle());
    holder.year.setText(String.valueOf(movieDetails.getReleaseYear()));
}

@Override
public int getItemCount() {
    if (movieList == null)
        return 0;
    return movieList.size();
}

class ViewHolder extends RecyclerView.ViewHolder {
    TextView name;
    TextView year;

    public ViewHolder(View itemView) {
        super(itemView);
        name = itemView.findViewById(R.id.movie_name);
        year = itemView.findViewById(R.id.release_year);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(onRecyclerViewItemClickListener != null){
                    int position = getAdapterPosition();
                    if(position != RecyclerView.NO_POSITION){
                        onRecyclerViewItemClickListener.onRecyclerViewItemClick(position);
                    }
                }
            }
        });
    }
}

public interface OnRecyclerViewItemClickListener {
    void onRecyclerViewItemClick(int position);
}

}

my AllMoviesFragment

    public class AllMoviesFragment extends Fragment implements RecyclerViewAdapter.OnRecyclerViewItemClickListener {
    private static final String CURR_MOVIE = "Current Movie";
    private static final String TAG = "MSApp";
    List<MovieDetails> movieList;
    RecyclerView recyclerView;

    public AllMoviesFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        movieList = App.getAppInstance().getDatabaseInstance().getMovieDao().getAllMovies();
        movieList.sort(new Comparator<MovieDetails>() {
            @Override
            public int compare(MovieDetails o1, MovieDetails o2) {
                return o2.getReleaseYear() - o1.getReleaseYear();
            }
        });
        View resultView = inflater.inflate(R.layout.fragment_all_movies, container, false);

        recyclerView = resultView.findViewById(R.id.recycler_view);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setHasFixedSize(true);
        RecyclerViewAdapter adapter = new RecyclerViewAdapter(movieList);
        adapter.setOnRecyclerViewItemClickListener(AllMoviesFragment.this);
        recyclerView.setAdapter(adapter);
        return resultView;
    }

    @Override
    public void onRecyclerViewItemClick(int position) {
        MovieDetails choosenMovie = movieList.get(position);
        FragmentManager fragmentManager = getFragmentManager();
        Fragment movieDetailsFragment = new MovieDetailsFragment();

        Bundle args = new Bundle();
        args.putParcelable(CURR_MOVIE, choosenMovie);
        movieDetailsFragment.setArguments(args);

        String tag = "MovieDetails";
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.main_container, movieDetailsFragment, tag);
        transaction.addToBackStack(tag);
        transaction.commit();
    }

}

sorry for long post. I dont know how to cut it
I use App class for db access if it is important

@AkakiKapanadze
you was almost right
I didnot see the error message because it disappeared less 1 second
错误信息

and class MovieDetailsFragment
movieDetailsClass

after I remove binder of ButterKnife all work... I dont know WHY - I always use Butterknife inside Fragments

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM