Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我正在使用recycler view开发一个简单的电影列表应用程序_Android_Interface_Onclick_Android Recyclerview_Onclicklistener - Fatal编程技术网

Android 我正在使用recycler view开发一个简单的电影列表应用程序

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

到目前为止,我还不熟悉android,我已经创建了带有装饰的回收器视图,但现在我无法在回收器视图中设置onClick listener,请帮助。。。第一个错误是clicklistener界面显示的

clicklistener已在编译单元中定义

因此onclick和onlongclick方法也会给出错误……在主要活动中,我在override中遇到错误

方法不从其超类重写

回收器触摸监听器代码:

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呢