我有一个带有recyclerview和firebase的应用程序。
在我的Activity中,我可以选择显示firebase数据库和存储中的图像。我可以选择显示所有图像,或者我可以选择显示特定日期的图像。
如果我要显示所有图像,请使用此代码:
mDatabaseRef = FirebaseDatabase.getInstance().getReference();
如果我想显示特定日期的图像,我将孩子命名为图像存储在数据库中的日期,如下所示:
mDatabaseRef = FirebaseDatabase.getInstance().getReference().child("2018-03.01");
现在我想让这个动态,根据我在recyclelerview中点击的日期,CHILD需要更改为该字符串/日期。
所以如果我点击日期2013-03-01我想要这个"字符串"被传递给我打算开的活动。
我的用户界面当前显示图像存储在firebase中的日期,例如:
2018年2月27日
2018年2月28日
2018年3月1日
因此,当我按2018-02-27为例时,我想将此日期传递给我的活动,并将其用作firebase中孩子的名字! < / p>
这是我的适配器:
@Override
public void onBindViewHolder(ImageViewHolder holder, int position) {
// Upload is my Upload class with constructor, setter, and getter.
// mUploads is my List
Upload dateId= mUploads.get(position);
// The String "dateNameId" gets all the dates,
// 2018-02-27 2018-02-28 2018-03-01
String dateNameId = dateId.getId();
holder.textViewName.setText(dateNameId);
}
现在,活动中的代码实际上设置了我们在适配器中检索的ID:
mDatabaseRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
Upload upload = postSnapshot.getValue(Upload.class);
//The setId that takes the Key in firebase which is the date
upload.setId(postSnapshot.getKey());
mUploads.add(upload);
}
我不知道如何在我的recyclerview中点击我点击的日期
答案 0 :(得分:1)
在“活动类”
中添加此类class RecyclerTouchListener implements RecyclerView.OnItemTouchListener{
private ClickListener clicklistener;
private GestureDetector gestureDetector;
public RecyclerTouchListener (Context context, final RecyclerView recycleView, final 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=recycleView.findChildViewUnder(e.getX(),e.getY());
if(child!=null && clicklistener!=null){
clicklistener.onLongClick(child,recycleView.getChildAdapterPosition(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.getChildAdapterPosition(child));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {}
}
为点击侦听器方法创建一个接口
public static interface ClickListener{
public void onClick (View view, int position);
public void onLongClick (View view, int position);
}`
实施Recyclerview Onclicklistener
recyclerView.addOnItemTouchListener(new RecyclerTouchListener(this, recyclerView, new ClickListener() {
@Override
public void onClick (View view, final int position) {
Toast.makeText(Activity.this, "press on position :" + position, Toast.LENGTH_LONG).show();
//do something
}
@Override
public void onLongClick (View view, int position) {
Toast.makeText(Activity.this, "Long press on position :" position, Toast.LENGTH_LONG).show();
//do something
}
}));
最后你将获得适配器位置,在onclick事件中使用position来从同一个Activity中的Arraylist中获取元素,没有在适配器和Activity之间传递数据的开销。
答案 1 :(得分:0)
我解决了!
在onItemClick上我可以使用position和getId方法来获取被点击的适配器的id。由于我的Id是日期,这解决了我的问题。
@Override
public void onItemClick(int position) {
Upload selectedItem = mUploads.get(position);
String selectedId = selectedItem.getId();
Intent intent = new Intent(this , ImagesActivity.class);
intent.putExtra("selectedId", selectedId);
startActivity(intent);
}