Android 我正在使用recycler view开发一个简单的电影列表应用程序
到目前为止,我还不熟悉android,我已经创建了带有装饰的回收器视图,但现在我无法在回收器视图中设置onClick listener,请帮助。。。第一个错误是clicklistener界面显示的 clicklistener已在编译单元中定义 因此onclick和onlongclick方法也会给出错误……在主要活动中,我在override中遇到错误 方法不从其超类重写 回收器触摸监听器代码:Android 我正在使用recycler view开发一个简单的电影列表应用程序,android,interface,onclick,android-recyclerview,onclicklistener,Android,Interface,Onclick,Android Recyclerview,Onclicklistener,到目前为止,我还不熟悉android,我已经创建了带有装饰的回收器视图,但现在我无法在回收器视图中设置onClick listener,请帮助。。。第一个错误是clicklistener界面显示的 clicklistener已在编译单元中定义 因此onclick和onlongclick方法也会给出错误……在主要活动中,我在override中遇到错误 方法不从其超类重写 回收器触摸监听器代码: public interface ClickListener { void onClick(Vi
public interface ClickListener {
void onClick(View view, int position);
void onLongClick(View view, int position);
}
public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {
private GestureDetector gestureDetector;
private MainActivity.ClickListener clickListener;
public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final MainActivity.ClickListener clickListener) {
this.clickListener = clickListener;
gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
@Override
public void onLongPress(MotionEvent e) {
View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
if (child != null && clickListener != null) {
clickListener.onLongClick(child, recyclerView.getChildLayoutPosition(child));
}
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
View child = rv.findChildViewUnder(e.getX(), e.getY());
if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
clickListener.onClick(child, rv.getChildLayoutPosition(child));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
}
main_activty:
public class MainActivity extends AppCompatActivity {
private List<Movie> movieList=new ArrayList<>();
private RecyclerView recyclerView;
private MoviesAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
recyclerView=(RecyclerView)findViewById(R.id.recycler_view);
mAdapter=new MoviesAdapter(movieList);
RecyclerView.LayoutManager mLayoutManager=new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(mAdapter);
prepareMovieData();
recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
recyclerView.setAdapter(mAdapter);
recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), recyclerView, new RecyclerTouchListener.ClickListener() {
@Override
public void onClick(View view, int position) {
Movie movie = movieList.get(position);
Toast.makeText(getApplicationContext(), movie.getTitle() + " is selected!", Toast.LENGTH_SHORT).show();
}
@Override
public void onLongClick(View view, int position) {
}
}));
}
private void prepareMovieData(){
Movie movie = new Movie("Mad Max: Fury Road", "Action & Adventure", "2015");
movieList.add(movie);
movie = new Movie("Inside Out", "Animation, Kids & Family", "2015");
movieList.add(movie);
movie = new Movie("Star Wars: Episode VII - The Force Awakens", "Action", "2015");
movieList.add(movie);
movie = new Movie("Shaun the Sheep", "Animation", "2015");
movieList.add(movie);
movie = new Movie("The Martian", "Science Fiction & Fantasy", "2015");
movieList.add(movie);
movie = new Movie("Mission: Impossible Rogue Nation", "Action", "2015");
movieList.add(movie);
movie = new Movie("Up", "Animation", "2009");
movieList.add(movie);
movie = new Movie("Star Trek", "Science Fiction", "2009");
movieList.add(movie);
movie = new Movie("The LEGO Movie", "Animation", "2014");
movieList.add(movie);
movie = new Movie("Iron Man", "Action & Adventure", "2008");
movieList.add(movie);
movie = new Movie("Aliens", "Science Fiction", "1986");
movieList.add(movie);
movie = new Movie("Chicken Run", "Animation", "2000");
movieList.add(movie);
movie = new Movie("Back to the Future", "Science Fiction", "1985");
movieList.add(movie);
movie = new Movie("Raiders of the Lost Ark", "Action & Adventure", "1981");
movieList.add(movie);
movie = new Movie("Goldfinger", "Action & Adventure", "1965");
movieList.add(movie);
movie = new Movie("Guardians of the Galaxy", "Science Fiction & Fantasy", "2014");
movieList.add(movie);
mAdapter.notifyDataSetChanged();
}
public interface ClickListener {
}
}
公共界面点击监听器{
void onClick(视图,int位置);
仅长按无效(视图,int位置);
}
公共类RecyclerTouchListener实现RecyclerView.OnItemTouchListener{
私人手势检测器;
private Main Activity.ClickListener ClickListener;
公共RecyclerTouchListener(上下文上下文、最终RecyclerView RecyclerView、最终MainActivity.ClickListener ClickListener){
this.clickListener=clickListener;
gestureDetector=new gestureDetector(上下文,new gestureDetector.SimpleOnGestureListener()){
@凌驾
公共布尔onSingleTapUp(运动事件e){
返回true;
}
@凌驾
公开无效在线新闻(运动事件e){
View child=recyclerView.findChildViewUnder(e.getX(),e.getY());
if(child!=null&&clickListener!=null){
clickListener.onLongClick(child,recyclerView.getChildLayoutPosition(child));
}
}
});
}
@凌驾
公共布尔值onInterceptTouchEvent(RecyclerView rv,MotionEvent e){
View child=rv.findChildViewUnder(e.getX(),e.getY());
if(child!=null&&clickListener!=null&&gestureDetector.onTouchEvent(e)){
单击listener.onClick(child,rv.getChildLayoutPosition(child));
}
返回false;
}
@凌驾
公共活动(RecyclerView rv、MotionE){
}
@凌驾
OnRequestDisallowinetCeptTouchEvent上的公共无效(布尔值DisallowinetCept){
}
}
主要活动:
公共类MainActivity扩展了AppCompatActivity{
private List movieList=new ArrayList();
私人回收站;
私人电影;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
recyclerView=(recyclerView)findViewById(R.id.recycler\u视图);
mAdapter=新电影适配器(电影列表);
RecyclerView.LayoutManager mLayoutManager=新的LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(mLayoutManager);
setItemAnimator(新的DefaultItemAnimator());
recyclerView.setAdapter(mAdapter);
prepareMovieData();
recyclerView.addItemDecoration(新的DividerItemDecoration(这是LinearLayoutManager.VERTICAL));
recyclerView.setAdapter(mAdapter);
recyclerView.addOnItemTouchListener(新的RecyclerTouchListener(getApplicationContext(),recyclerView,新的RecyclerTouchListener.ClickListener()){
@凌驾
公共void onClick(视图,int位置){
Movie=movieList.get(位置);
Toast.makeText(getApplicationContext(),movie.getTitle()+“已选中!”,Toast.LENGTH\u SHORT.show();
}
@凌驾
仅长按公共无效(视图,int位置){
}
}));
}
私有void prepareMovieData(){
电影=新片(《疯狂麦克斯:狂暴之路》、《动作与冒险》、《2015》);
movieList.add(电影);
电影=新电影(“由内而外”、“动画、儿童与家庭”、“2015”);
movieList.add(电影);
电影=新电影(“星球大战:第七集-原力觉醒”,“行动”,“2015”);
movieList.add(电影);
电影=新电影(“肖恩羊”,“动画”,“2015”);
movieList.add(电影);
电影=新电影(“火星人”,“科幻与幻想”,“2015”);
movieList.add(电影);
电影=新电影(“任务:不可能的流氓国家”,“行动”,“2015”);
movieList.add(电影);
电影=新电影(“Up”,“Animation”,“2009”);
movieList.add(电影);
电影=新电影(“星际迷航”、“科幻小说”、“2009”);
movieList.add(电影);
电影=新电影(“乐高电影”、“动画”、“2014”);
movieList.add(电影);
电影=新电影(“钢铁侠”,“动作与冒险”,“2008”);
movieList.add(电影);
电影=新电影(“外星人”、“科幻小说”、“1986”);
movieList.add(电影);
电影=新电影(“鸡跑”、“动画”、“2000”);
movieList.add(电影);
电影=新电影(“回到未来”、“科幻小说”、“1985”);
movieList.add(电影);
电影=新电影(《迷失方舟的掠夺者》,《动作与冒险》,《1981》);
movieList.add(电影);
电影=新电影(“金手指”、“动作与冒险”、“1965”);
movieList.add(电影);
电影=新电影(“银河守护者”、“科幻与幻想”、“2014”);
movieList.add(电影);
mAdapter.notifyDataSetChanged();
}
公共界面ClickListener{
}
}
我正在使用一个自定义的RecyclerView.OnItemTouchListener实现-
public class RecycleItemClickListener implements RecyclerView.OnItemTouchListener {
private OnItemClickListener mListener;
public interface OnItemClickListener {
public void onItemClick(View view, int position);
}
GestureDetector mGestureDetector;
public RecycleItemClickListener(Context context, OnItemClickListener listener) {
mListener = listener;
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
View childView = view.findChildViewUnder(e.getX(), e.getY());
if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
}
然后像这样使用这个自定义的RecycleItemClickListener
-
recyclerView.addOnItemTouchListener(
new RecycleItemClickListener(context, new RecycleItemClickListener.OnItemClickListener() {
@Override public void onItemClick(View view, int position) {
// TODO Handle item click
}
})
);
这总是有效的:)谢谢。。但是在您基本上在设置recyclerView的活动/片段中完成recyclerView.setAdapter(yourAdapter)
之后,我应该在哪里实现onItemTouchListener呢