Android中OnItemTouchListener和RecyclerView更新有问题
这是我的主要活动RecyclerView AddonimtouchListener实现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.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();
}
}));
}