【问题标题】:Strange behavior of OnItemClickListener inside RecyclerView inside Fragment片段内 RecyclerView 内 OnItemClickListener 的奇怪行为
【发布时间】:2019-09-09 16:35:49
【问题描述】:

需要有关 android 应用程序 (java) 的帮助
我的应用程序以 SplashActivity 开头。在此期间,我通过改造请求获得 json,并在成功响应后填充我的数据库

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();
}

DB成功加载后自动启动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();
}

}

并立即在内部片段 AllMoviesFragment(在 recyclerView 内部)中加载电影列表。到目前为止一切正常。
现在我设置了 onRecyclerViewItemClickListener - 它必须在 MovieListActivity 中打开另一个片段,但不是这个 - 我的应用程序从头开始重新启动,我再次观察到 SpalshActivity 的加载(我在请求期间放置了进度条),再次是我的 RecyclerView...

我的 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);
}

}

我的 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();
    }

}

抱歉,帖子太长了。不知道怎么剪
如果它很重要,我会使用 App 类进行数据库访问

【问题讨论】:

  • 您能否在该错误期间(应用重新启动时)提供 logcat 输出?
  • @AkakiKapanadze 它重新启动,没有任何错误。即使在应用程序第一次启动期间,我也可以在 logcat 中看到“E/LB:无法打开文件:没有这样的文件或目录”以及在重新启动期间 - 相同的消息。但我认为这与我的问题无关
  • @AkakiKapanadze 如果我只是在 OnItemClick 期间输出 Toast - 一切正常...但如果我尝试调用 Fragment - 应用程序从头开始

标签: java android android-recyclerview fragment onitemclicklistener


【解决方案1】:

@AkakiKapanadze
你几乎是对的
我没有看到错误消息,因为它消失了不到 1 秒

和类 MovieDetailsFragment

在我删除 ButterKnife 的活页夹后所有工作......我不知道为什么 - 我总是在 Fragments 中使用 Butterknife

【讨论】:

    猜你喜欢
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多