首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用findViewById从一个空方法中获取Recyclerview id

如何使用findViewById从一个空方法中获取Recyclerview id
EN

Stack Overflow用户
提问于 2018-07-09 07:47:03
回答 2查看 555关注 0票数 0

我正在尝试点击一个回收器查看项目,并获得被点击项目的数据。

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

我在运行方法时遇到了一个问题。我想,由于上下文的原因,方法在R.id中找不到RecyclerView。

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

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

代码语言:javascript
复制
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);
}
}

当禁用findViewById行时,查询将工作并获得值mRows。但是,Recyclerview set适配器不起作用。

下面是方法的第一个调用和RecyclerView适配器代码

代码语言:javascript
复制
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);


            }
        });


    }

}

}

下面是错误日志

代码语言:javascript
复制
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)

这不仅仅是一个空的异常问题。它包含上下文覆盖问题

感谢您的回复。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-09 09:20:19

代码语言:javascript
复制
 MainActivity act = new MainActivity();
 act.sqlQuery(kSenArab);

您不应该尝试以这种方式初始化MainActivity。您面临该错误的原因是由于上述尝试。

尽量不要从你的ViewHolder引用MainActivity。如果您想在MainActivity中处理onClick,那么实现一个接口,如此SO所示。

票数 0
EN

Stack Overflow用户

发布于 2018-07-09 11:38:51

这里:

代码语言:javascript
复制
MainActivity act = new MainActivity();
 act.sqlQuery(kSenArab);

不是从需要上下文的活动中访问方法的正确方式。

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

代码语言:javascript
复制
( (MainActivity) rContext).sqlQuery(kSenArab);

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51236795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档