Android RecyclerView-如何向MainActivity发送数据

Android RecyclerView-如何向MainActivity发送数据,android,android-recyclerview,Android,Android Recyclerview,我有一个用于用户添加收藏夹的RecyclerView适配器。recyclerview填充在对话框片段中 公共类FavoriteAdapter扩展了RecyclerView。适配器实现ILatLong{ 私人语境; 视图; 主要活动主要活动; 私人列表收藏夹; 私有SQLiteDB-mDatabase; 私人职位; 私人ILatLong mCallback; 公共收藏夹适配器(ILatLong mCallback){ this.mCallback=mCallback; } 公共收藏夹适配器(上下文

我有一个用于用户添加收藏夹的RecyclerView适配器。recyclerview填充在对话框片段中

公共类FavoriteAdapter扩展了RecyclerView。适配器实现ILatLong{
私人语境;
视图;
主要活动主要活动;
私人列表收藏夹;
私有SQLiteDB-mDatabase;
私人职位;
私人ILatLong mCallback;
公共收藏夹适配器(ILatLong mCallback){
this.mCallback=mCallback;
}
公共收藏夹适配器(上下文上下文,列表收藏夹){
this.context=上下文;
this.listFavorites=listFavorites;
mDatabase=newsqlitedb(上下文);
}
@凌驾
BindViewHolder上的公共无效(最终收藏夹ViewHolder,最终整型){
final Favorite singleFavorite=listFavorites.get(mPosition);
view.setOnClickListener(新的view.OnClickListener(){
@凌驾
公共void onClick(视图v){
Toast.makeText(上下文,“单击“+”+”singleFavorite.getName()+”,Toast.LENGTH_SHORT,true).show();
//mainActivity.onLatLngData(singleFavorite.getLat(),singleFavorite.getLong());
onLatLngData(singleFavorite.getLat(),singleFavorite.getLong());
}
});
//其他东西
@凌驾
仅限上市数据(双倍lat、双倍lng){
试一试{
mCallback=(ILatLong)上下文;
}
catch(ClassCastException e){
Log.d(“MyDialog”,“活动未实现ILatLong接口”);
}
}
}
接口:

公共接口ILatLong{
仅作废LATLNGDATA(双lat、双lng);
}
主要活动方法:

public类MainActivity扩展了AppCompatActivity
实现NavigationView.OnNavigationItemSelectedListener,ILatLong{
@凌驾
仅限上市数据(双倍lat、双倍lng){
//使用这些值
}
}
正如您所看到的,我已经在onBindViewHolder中设置了onclicklistener,因此我知道单击了哪个项目,当单击recyclerview项目时,它会显示一个具有正确项目名称(或我想要的任何其他属性)的toast

当我尝试通过取消onclick中的行注释将纬度和经度发送回mainactivity方法时,我得到 “java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法…onLatLngData(java.lang.Double,java.lang.Double)”

如何将这些数据发送回mainactivity?我曾尝试使用接口回调mainactivity,但运气不佳,但可能我做得不对


编辑:包括接口回调内容

要使回调正常工作,您必须执行这4个步骤

  • 创建一个包含回调函数的接口
  • 在您的主要活动中实现此接口
  • 在FavoriteAdapter中,创建MyCallback类型的变量
  • 在onBindViewHolder中,您应该有如下内容:

    @Override
        public void onBindViewHolder(final FavoriteViewHolder holder, final int mPosition) {
            final Favorite singleFavorite = listFavorites.get(mPosition);
    
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(myCallback != null){
                        myCallback.onCallbackClicked(/* your data here */);
                     }
                }
            });
    }
    
  • 这是一个重要的步骤,将侦听器(主活动)传递给适配器,您可以使用构造函数传递它
  • 或者使用setter

    public void setCallback(MyCallback myCallback){
       this.myCallback = myCallback;
    }
    
    现在你可以走了。

    谢谢你的帮助。 我通过我的主要活动设法解决了这个问题

    问题是它运行MainActivty->FavoriteDialog->FavoriteAdapter,我想我对这里的链感到困惑。 也许它会帮助其他人

    主要活动:

    public类MainActivity扩展了AppCompatActivity
    实现NavigationView.OnNavigationItemSelectedListener,ILatLong{
    主要活动能力;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mActivity=这个;
    }
    //在我调用FavoriteDialog片段的地方,在构造函数中传递mActivity
    FragmentManager fm=getSupportFragmentManager();
    FavoriteDialogFavorite=新的dialogFavorite(上下文、活动);
    dialogFragment.show(fm,“FavoriteDialog”);
    }
    
    对话框收藏夹

    DialogFavorite(上下文、MainActivity和MacActivity){
    mainActivity=macActivity;
    }
    //适配器,传递main活动
    FavoriteAdapter mAdapter=新的FavoriteAdapter(上下文、所有收藏夹、mainActivity);
    setAdapter(mAdapter);
    
    收藏夹适配器:

    public-FavoriteAdapter(上下文上下文、列表收藏夹、main-activity-mActivity){
    this.context=上下文;
    this.listFavorites=listFavorites;
    mDatabase=newsqlitedb(上下文);
    this.mainActivity=macActivity;
    }
    
    现在,在my FavoriteAdapter onclick中调用mainActivity可以工作了:

    @覆盖
    BindViewHolder上的公共无效(最终收藏夹ViewHolder,最终整型){
    final Favorite singleFavorite=listFavorites.get(mPosition);
    view.setOnClickListener(新的view.OnClickListener(){
    @凌驾
    公共void onClick(视图v){
    mainActivity.OnlatlingData(52.24621820.970564);
    }
    });
    
    这是因为您刚刚声明了MainActivity MainActivity;未初始化。您还需要传入构造函数并通过此引用。MainActivity=MainActivity;在MainActivity中发布您创建的接口的完整代码请完全共享适配器类我很想将其标记为的副本,但这并没有真正的帮助为了解决这个问题。您没有在构造函数参数中传递MainActivity,因此它是
    null
    。它没有初始化。这将非常有用,并且非常容易让您对
    MainActivity
    产生影响。感谢您的回答,这与我在没有运气的情况下已经尝试过的类似。您能看看我更新的吗添加回调的问题?我添加了第4步。构造函数,但并没有改变,它说
     MyCallback myCallback;
    
    @Override
        public void onBindViewHolder(final FavoriteViewHolder holder, final int mPosition) {
            final Favorite singleFavorite = listFavorites.get(mPosition);
    
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(myCallback != null){
                        myCallback.onCallbackClicked(/* your data here */);
                     }
                }
            });
    }
    
    public FavoriteAdapter(MyCallback myCallback){
       this.myCallback = myCallback;
    }
    
    public void setCallback(MyCallback myCallback){
       this.myCallback = myCallback;
    }