RecyclerView将信息传递给活动

时间:2018-03-01 12:41:51

标签: android android-recyclerview

我有一个带有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中点击我点击的日期

2 个答案:

答案 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);
}