Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.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中OnItemTouchListener和RecyclerView更新有问题_Android_Onclick_Android Recyclerview_Android Cardview - Fatal编程技术网

Android中OnItemTouchListener和RecyclerView更新有问题

Android中OnItemTouchListener和RecyclerView更新有问题,android,onclick,android-recyclerview,android-cardview,Android,Onclick,Android Recyclerview,Android Cardview,这是我的主要活动RecyclerView AddonimtouchListener实现 recyclerView.addOnItemTouchListener(new RecyclerViewTouchListener(this, recyclerView, new NewAlbumAdapter.RecyclerViewClickListener() { @Override public void onClick(View view, int p

这是我的主要活动RecyclerView AddonimtouchListener实现

recyclerView.addOnItemTouchListener(new RecyclerViewTouchListener(this, recyclerView, new NewAlbumAdapter.RecyclerViewClickListener() {
            @Override
            public void onClick(View view, int position) {
                String[] allImagePathListInAnAlbum;
                Log.e("Item Clicked is","++++ "+allAlbumsName[position]);
                Log.e("Item Number is", "++++ " +String.valueOf(position));
                allImagePathListInAnAlbum=filePathToAllAlbums[position].list();
                Intent insideAlbumIntent=new Intent(getApplicationContext(), ImagesInsideAlbumMainActivity.class);
                insideAlbumIntent.putExtra("AllImagePath",allImagePathListInAnAlbum);
                startActivity(insideAlbumIntent);

            }

            @Override
            public void onLongClick(View view, int position) {
                Toast.makeText(getApplicationContext(),allAlbumsName[position]+" Is Long clicked\nAt Position: "+String.valueOf(position),Toast.LENGTH_SHORT).show();


            }
        }));
这是我已经实现的RecycleWebTouchListener

public class RecyclerViewTouchListener implements RecyclerView.OnItemTouchListener{

    private GestureDetector gestureDetector;
    private NewAlbumAdapter.RecyclerViewClickListener clickListener;

    public RecyclerViewTouchListener(Context context, final RecyclerView recyclerView, final NewAlbumAdapter.RecyclerViewClickListener 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.getChildPosition(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.getChildPosition(child));
        }
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {    }

}
当我单击之前添加到RecyclerView中的项目时,单击效果良好。只调用1次onClick

但是,当我将一个项目添加到RecyclerView并单击新创建的项目时,onClick方法会被调用两次

@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.getChildPosition(child));
        }
        return false;
    }
从中返回False。它在RecyclerView中使用了这个方法: 我运行了调试器,并对一些内容的值进行了注释:

if (action != MotionEvent.ACTION_DOWN) //action:1
 {

final int listenerCount = mOnItemTouchListeners.size(); //listenerCount=2
//While for previously added items it was 1 only.

for (int i = 0; i < listenerCount; i++) {

final OnItemTouchListener listener = mOnItemTouchListeners.get(i);

if (listener.onInterceptTouchEvent(this, e)) {//e:MotionEvent {action==ACTION_UP
                   mActiveOnItemTouchListener = listener;
                   return true;
                }
它重新初始化所有变量并

public void initRecyclerViewForAlbumView() {
        RecyclerView recyclerView;


        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);

        GridLayoutManager gridLayoutManager = new GridLayoutManager(MainActivity.this, 2);

        //recyclerView.addItemDecoration(new GridSpacingItemDecoration(spanCount,spacing,includeEdge));
        recyclerView.setLayoutManager(gridLayoutManager);

        newAlbumAdapter = new NewAlbumAdapter(recyclerView.getContext(),filePathToAllAlbums,allAlbumsName,countOfAlbums,firstImageOfAllFile);
        recyclerView.setAdapter(newAlbumAdapter);

        recyclerView.addOnItemTouchListener(new RecyclerViewTouchListener(this, recyclerView, new RecyclerViewClickListener() {
            @Override
            public void onClick(View view, int position) {
                String[] allImagePathListInAnAlbum;
                Log.e("Item Clicked is", "++++ " + allAlbumsName[position]);
                Log.e("Item Number is", "++++ " + String.valueOf(position));
                allImagePathListInAnAlbum = filePathToAllAlbums[position].list();
                Intent insideAlbumIntent = new Intent(getApplicationContext(), ImagesInsideAlbumMainActivity.class);
                insideAlbumIntent.putExtra("AllImagePath", allImagePathListInAnAlbum);
                startActivity(insideAlbumIntent);

            }

            @Override
            public void onLongClick(View view, int position) {

                Toast.makeText(getApplicationContext(), allAlbumsName[position] + " Is Long clicked\nAt Position: " + String.valueOf(position), Toast.LENGTH_SHORT).show();


            }
        }));

    }
我有两个问题:

1> 是否有其他方法更新RecyclerView并在活动上显示新添加的目录。(我使用了所有notify方法,但它们似乎都不起作用)

2> 如果在
onFinishEditDialog
中重新初始化RecyclerView,则会调用
OnTouchItemListener
中的onClick两次。如果我不这样做,OnClick工作正常,但是新创建的目录将不会显示在活动上

请帮助解决此问题。 如果有人能帮忙,我将非常感激

public void initRecyclerViewForAlbumView() {
        RecyclerView recyclerView;


        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);

        GridLayoutManager gridLayoutManager = new GridLayoutManager(MainActivity.this, 2);

        //recyclerView.addItemDecoration(new GridSpacingItemDecoration(spanCount,spacing,includeEdge));
        recyclerView.setLayoutManager(gridLayoutManager);

        newAlbumAdapter = new NewAlbumAdapter(recyclerView.getContext(),filePathToAllAlbums,allAlbumsName,countOfAlbums,firstImageOfAllFile);
        recyclerView.setAdapter(newAlbumAdapter);

        recyclerView.addOnItemTouchListener(new RecyclerViewTouchListener(this, recyclerView, new RecyclerViewClickListener() {
            @Override
            public void onClick(View view, int position) {
                String[] allImagePathListInAnAlbum;
                Log.e("Item Clicked is", "++++ " + allAlbumsName[position]);
                Log.e("Item Number is", "++++ " + String.valueOf(position));
                allImagePathListInAnAlbum = filePathToAllAlbums[position].list();
                Intent insideAlbumIntent = new Intent(getApplicationContext(), ImagesInsideAlbumMainActivity.class);
                insideAlbumIntent.putExtra("AllImagePath", allImagePathListInAnAlbum);
                startActivity(insideAlbumIntent);

            }

            @Override
            public void onLongClick(View view, int position) {

                Toast.makeText(getApplicationContext(), allAlbumsName[position] + " Is Long clicked\nAt Position: " + String.valueOf(position), Toast.LENGTH_SHORT).show();


            }
        }));

    }