首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RecyclerView.Adapter onClick

RecyclerView.Adapter onClick
EN

Stack Overflow用户
提问于 2016-08-08 00:50:08
回答 1查看 609关注 0票数 0

在我的RecyclerView.Adapter中实现view.OnClickListener时遇到了问题。我正在尝试实现多窗格布局(带有RecyclerView和细节并排的横向平板电脑布局版本)。到目前为止,我已经创建了这个Activity

代码语言:javascript
复制
public class MovieListActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_movie_list);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        MovieListFragment movieListFragment = new MovieListFragment();
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.recycler_view_fragment, movieListFragment);
        transaction.addToBackStack(null);

        transaction.commit();

    }

}

它启动了一个Fragment

代码语言:javascript
复制
public class MovieListFragment extends Fragment {

    @BindView(R.id.recyclerView)
    RecyclerView mRecyclerView;
    private MoviesAdapter mAdapter;

    public MovieListFragment() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mAdapter = new MoviesAdapter(getContext());

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_movie_list, container, false);
        ButterKnife.bind(this,view);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        mRecyclerView.setAdapter(mAdapter);
        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
        getPopularMovies();
    }

    private void getPopularMovies() {
        RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint("http://api.themoviedb.org")
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .build();
        MoviesApiService service = restAdapter.create(MoviesApiService.class);
        service.getPopularMovies(new Callback<Movie.MovieResult>() {
            @Override
            public void success(Movie.MovieResult movieResult, Response response) {
                mAdapter.setMovieList(movieResult.getResults());
            }

            @Override
            public void failure(RetrofitError error) { error.printStackTrace(); }
        });
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

    }

    @Override
    public void onDetach() {
        super.onDetach();
    }

}

它调用RecyclerView.Adapter

代码语言:javascript
复制
public class MoviesAdapter extends RecyclerView.Adapter<MovieViewHolder>  {

    private List<Movie> mMovieList;
    private LayoutInflater mInflater;
    private Context mContext;

    public MoviesAdapter(Context context) {
        this.mContext = context;
        this.mInflater = LayoutInflater.from(context); //
    }

    @Override
    public MovieViewHolder onCreateViewHolder(ViewGroup parent, final int viewType) {
        View view = mInflater.inflate(R.layout.movie_row_item, parent, false);
        final MovieViewHolder viewHolder = new MovieViewHolder(view);
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                int position = viewHolder.getAdapterPosition();
                Intent intent = new Intent(mContext, MovieDetailActivity.class);
                intent.putExtra(MovieDetailActivity.MOVIE_EXTRA, mMovieList.get(position));
                mContext.startActivity(intent);


            }
        });
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(MovieViewHolder holder, int position) {
        Movie movie = mMovieList.get(position);
        Picasso.with(mContext)
                .load(movie.getPoster())
                .placeholder(R.color.colorAccent)
                .into(holder.thumbnail);
        holder.movieTitle.setText(movie.getTitle());
        holder.rating.setText(movie.getRating());

    }

    @Override
    public int getItemCount() {
        return (mMovieList == null) ? 0 : mMovieList.size();
    }

    public void setMovieList(List<Movie> movieList) {
        this.mMovieList = new ArrayList<>();
        this.mMovieList.addAll(movieList);
        notifyDataSetChanged();
    }
}

onClick中,我需要决定是启动一个新的Activity (就像在我的代码中一样),还是更新细节Fragment的内容(在我的tablet横向布局中)。根据this link的说法,你应该根据事实来决定你的DetailFragment在类似这样的活动中是否为!= null:

代码语言:javascript
复制
public void onItemSelected(int position) {
        DisplayFragment displayFrag = (DisplayFragment) getFragmentManager()
                                    .findFragmentById(R.id.display_frag);
        if (displayFrag == null) {
            // DisplayFragment (Fragment B) is not in the layout (handset layout), 
            // so start DisplayActivity (Activity B) 
            // and pass it the info about the selected item 
            Intent intent = new Intent(this, DisplayActivity.class);
            intent.putExtra("position", position);
            startActivity(intent);
        } else { 
            // DisplayFragment (Fragment B) is in the layout (tablet layout), 
            // so tell the fragment to update 
            displayFrag.updateContent(position);
        } 
    } 

但是我不能在Adapter中检查这个。任何帮助都将不胜感激!谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-08 01:16:20

创建自定义接口单击操作以获取fragment类中的控件

我希望它能为你工作

公共类MoviesAdapter扩展了RecyclerView.Adapter {

代码语言:javascript
复制
MoviesAdapterCallback moviesAdapterCallback;
private List<Movie> mMovieList;
private LayoutInflater mInflater;
private Context mContext;

public MoviesAdapter(Context context,MoviesAdapterCallback moviesAdapterCallback) {
    this.mContext = context;
    this.moviesAdapterCallback =moviesAdapterCallback;
    this.mInflater = LayoutInflater.from(context); //
}

@Override
public MovieViewHolder onCreateViewHolder(ViewGroup parent, final int viewType) {
    View view = mInflater.inflate(R.layout.movie_row_item, parent, false);
    final MovieViewHolder viewHolder = new MovieViewHolder(view);
    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

           /* int position = viewHolder.getAdapterPosition();
            Intent intent = new Intent(mContext, MovieDetailActivity.class);
            intent.putExtra(MovieDetailActivity.MOVIE_EXTRA, mMovieList.get(position));
            mContext.startActivity(intent);

*/ moviesAdapterCallback.MovieClicked(视图);

代码语言:javascript
复制
        }
    });
    return viewHolder;
}

@Override
public void onBindViewHolder(MovieViewHolder holder, int position) {
    Movie movie = mMovieList.get(position);
    Picasso.with(mContext)
            .load(movie.getPoster())
            .placeholder(R.color.colorAccent)
            .into(holder.thumbnail);
    holder.movieTitle.setText(movie.getTitle());
    holder.rating.setText(movie.getRating());

}

@Override
public int getItemCount() {
    return (mMovieList == null) ? 0 : mMovieList.size();
}

public void setMovieList(List<Movie> movieList) {
    this.mMovieList = new ArrayList<>();
    this.mMovieList.addAll(movieList);
    notifyDataSetChanged();
}

public interface MoviesAdapterCallback {
    void MovieClicked(View view);
}

}

在片段类中

公共类MovieListFragment扩展了片段{

代码语言:javascript
复制
@BindView(R.id.recyclerView)
RecyclerView mRecyclerView;
private MoviesAdapter mAdapter;

public MovieListFragment() {
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_movie_list, container, false);
    ButterKnife.bind(this,view);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    mAdapter = new MoviesAdapter(getContext(), new MoviesAdapter.MoviesAdapterCallback(){
        @Override
        public void MovieClicked(View view) {
            DisplayFragment displayFrag = (DisplayFragment) getFragmentManager()
                    .findFragmentById(R.id.display_frag);
            if (displayFrag == null) {
                // DisplayFragment (Fragment B) is not in the layout (handset layout),
                // so start DisplayActivity (Activity B)
                // and pass it the info about the selected item
                Intent intent = new Intent(this, DisplayActivity.class);
                intent.putExtra("position", position);
                startActivity(intent);
            } else {
                // DisplayFragment (Fragment B) is in the layout (tablet layout),
                // so tell the fragment to update
                displayFrag.updateContent(position);
            }
        }
    });
    mRecyclerView.setAdapter(mAdapter);
    return view;
}

@Override
public void onStart() {
    super.onStart();
    getPopularMovies();
}

private void getPopularMovies() {
    RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint("http://api.themoviedb.org")
            .setLogLevel(RestAdapter.LogLevel.FULL)
            .build();
    MoviesApiService service = restAdapter.create(MoviesApiService.class);
    service.getPopularMovies(new Callback<Movie.MovieResult>() {
        @Override
        public void success(Movie.MovieResult movieResult, Response response) {
            mAdapter.setMovieList(movieResult.getResults());
        }

        @Override
        public void failure(RetrofitError error) { error.printStackTrace(); }
    });
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);

}

@Override
public void onDetach() {
    super.onDetach();
}

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38816396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档