Android 如何从void方法中使用findViewById获取Recyclerview id

Android 如何从void方法中使用findViewById获取Recyclerview id,android,android-recyclerview,android-context,Android,Android Recyclerview,Android Context,我正在尝试单击recyclerview项并获取已单击项的数据 在这一次,我想使用一个方法来查询数据库并在recyclerview中显示数据 方法运行时,我遇到了一个问题。方法在R.id处找不到RecyclerView,我想是因为上下文的关系 这是我尝试的代码,方法在MainActivity中,但不在onCreate方法中 调试时,它会在下面代码的第一行停止 public class MainActivity extends AppCompatActivity { ... @Overri

我正在尝试单击recyclerview项并获取已单击项的数据

在这一次,我想使用一个方法来查询数据库并在recyclerview中显示数据

方法运行时,我遇到了一个问题。方法在R.id处找不到RecyclerView,我想是因为上下文的关系

这是我尝试的代码,方法在MainActivity中,但不在onCreate方法中

调试时,它会在下面代码的第一行停止

public class MainActivity extends AppCompatActivity {

  ...


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


mRcyView = (RecyclerView) findViewById(R.id.rv);
  ...

}
 public void sqlQuery  (String param) {

    **mRcyView = (RecyclerView)this.findViewById(R.id.rv);**
    mdbHelper = new DB_Helper(this);
    mRows = new ArrayList<>();
    mRows = mdbHelper.getListRow2(param);
    mRvAdapter = new RV_Adapter(this,mRows);
    mRcyView.setAdapter(mRvAdapter);
}
}
public类MainActivity扩展了AppCompatActivity{
...
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRcyView=(RecyclerView)findViewById(R.id.rv);
...
}
公共void sqlQuery(字符串参数){
**mRcyView=(RecyclerView)this.findViewById(R.id.rv)**
mdbHelper=新的DB_助手(此);
mRows=新的ArrayList();
mRows=mdbHelper.getListRow2(参数);
mRvAdapter=新的RV_适配器(此为mRows);
设置适配器(mRvAdapter);
}
}
禁用findViewById行时,查询工作并获得值mRows。但是,Recyclerview设置适配器不工作

下面是方法first调用和RecyclerView适配器代码

public class RV_Adapter extends RecyclerView.Adapter<RV_Adapter.ViewHolder> {




public RV_Adapter(Context rContext, List<EachRow> rows) {

    this.rows = rows;
    this.rContext = rContext;
}




public class ViewHolder extends RecyclerView.ViewHolder {

   ...

    public ViewHolder(View v, final Context context) {

        super(v);

        this.context = context;
        ...


        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int pos = getAdapterPosition();
                EachRow eachRow = rows.get(pos);
                String kSenArab = eachRow.getkSenArab();

                MainActivity act = new MainActivity();
                act.sqlQuery(kSenArab);


            }
        });


    }

}
公共类RV_适配器扩展了RecyclerView.Adapter{ 公共RV_适配器(上下文rContext,列表行){ this.rows=行; this.rContext=rContext; } 公共类ViewHolder扩展了RecyclerView.ViewHolder{ ... 公共视图持有者(视图v,最终上下文){ 超级(五); this.context=上下文; ... v、 setOnClickListener(新视图。OnClickListener(){ @凌驾 公共void onClick(视图){ int pos=getAdapterPosition(); EachRow EachRow=rows.get(pos); 字符串kSenArab=eachRow.getkSenArab(); MainActivity act=新的MainActivity(); sqlQuery(kSenArab); } }); } } }

这是错误日志

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
    at android.support.v7.app.AppCompatDelegateImplBase.<init>(AppCompatDelegateImplBase.java:117)
    at android.support.v7.app.AppCompatDelegateImplV9.<init>(AppCompatDelegateImplV9.java:149)
    at android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.java:56)
    at android.support.v7.app.AppCompatDelegateImplV23.<init>(AppCompatDelegateImplV23.java:31)
    at android.support.v7.app.AppCompatDelegateImplN.<init>(AppCompatDelegateImplN.java:31)
    at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:198)
    at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:183)
    at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:519)
    at android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:190)
    at com.mustafa.otre.MainActivity.sqlQuery(MainActivity.java:112)
    at com.mustafa.otre.RV_Adapter$ViewHolder$1.onClick(RV_Adapter.java:116)
    at android.view.View.performClick(View.java:5609)
    at android.view.View$PerformClick.run(View.java:22259)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6077)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“android.view.Window$Callback android.view.Window.getCallback()”
位于android.support.v7.app.AppCompateDelegateImplbase。(appCompateDelegateImplbase.java:117)
位于android.support.v7.app.AppCompateDelegateImplv9。(AppCompateDelegateImplv9.java:149)
在android.support.v7.app.AppCompateDelegateImplv14。(AppCompateDelegateImplv14.java:56)
位于android.support.v7.app.AppCompateDelegateImplv23。(AppCompateDelegateImplv23.java:31)
位于android.support.v7.app.AppCompateDelegateImpln.(appCompateDelegateImpln.java:31)
在android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:198)中
位于android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:183)
位于android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:519)
位于android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:190)
位于com.mustafa.otre.MainActivity.sqlQuery(MainActivity.java:112)
在com.mustafa.otre.RV_Adapter$ViewHolder$1.onClick(RV_Adapter.java:116)
在android.view.view.performClick上(view.java:5609)
在android.view.view$PerformClick.run(view.java:22259)
位于android.os.Handler.handleCallback(Handler.java:751)
位于android.os.Handler.dispatchMessage(Handler.java:95)
位于android.os.Looper.loop(Looper.java:154)
位于android.app.ActivityThread.main(ActivityThread.java:6077)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
这不是唯一的空异常问题。它包含上下文到达问题

谢谢你的回复

 MainActivity act = new MainActivity();
 act.sqlQuery(kSenArab);
您不应尝试以这种方式初始化
MainActivity
。您面临错误的原因是由于上述尝试

请尝试不要从您的ViewHolder中引用
MainActivity
。如果要处理onClick-in-main活动,请实现如图所示的接口。

此处:

MainActivity act = new MainActivity();
 act.sqlQuery(kSenArab);
从需要上下文的活动访问方法不正确

使用传入的上下文参数执行此操作。
RV_Adapter

( (MainActivity) rContext).sqlQuery(kSenArab);

最好的方法是使用
接口
创建一个监听器,用于从适配器更新活动。

此方法在哪个类中?mainactivity类可以使用调用此方法的代码更新您的问题吗?这足够了吗?它仍然没有提到调用
sqlQuery
的位置以及您在哪里声明了此方法
RecyclerView
谢谢。我更改了结构,并使用接口将一个值从一个类传递给activity。