onClick on Cardview来自firebase

时间:2017-05-30 09:46:52

标签: android nullpointerexception

我是在我的新闻评论者那里做到的:

    public class NewsViewHolder extends RecyclerView.ViewHolder {

    View mView;
    Context context;

    public NewsViewHolder(final View itemView) {
        super(itemView);
        mView = itemView;
        itemView.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                Intent intent = new Intent(view.getContext(), DetalleFragment.class);
                view.getContext().startActivity(intent);
            }
        });
    }

    public void setTitular(String titular) {
        TextView post_titular = (TextView) mView.findViewById(R.id.titleText);
        post_titular.setText(titular);
    }

    public void setImage(Context ctx, String image){
        ImageView post_image = (ImageView) mView.findViewById(R.id.imageView);
        Picasso.with(ctx).load(image).into(post_image);
    }
}

当我在cardview中执行onClick时出现问题它会抛出下一个错误:

  

E / AndroidRuntime:致命异常:主要流程:   es.laramira.atellez.moroninfo,PID:5200   android.content.ActivityNotFoundException:无法找到显式   活动课   {es.laramira.atellez.moroninfo / es.laramira.atellez.moroninfo.Fragments.DetalleFragment};   你有没有在AndroidManifest.xml中声明这个活动?在   android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1805)   在   android.app.Instrumentation.execStartActivity(Instrumentation.java:1523)   在android.app.Activity.startActivityForResult(Activity.java:4224)at   android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)   在   android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)   在android.app.Activity.startActivityForResult(Activity.java:4183)at   android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)   在android.app.Activity.startActivity(Activity.java:4507)at   android.app.Activity.startActivity(Activity.java:4475)at   es.laramira.atellez.moroninfo.Models.NewsViewHolder $ 1.onClick(NewsViewHolder.java:32)   在android.view.View.performClick(View.java:5610)at   android.view.View $ PerformClick.run(View.java:22265)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)   在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

我在AndroidManifest.xml中定义了新活动,但我不知道如何解决这个问题......

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="es.laramira.atellez.moroninfo">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".ActivityDetalle"></activity>
    </application>

</manifest>

我在Stackoverflow和其他网站上尝试了很多答案,但我无法解决这个问题......

3 个答案:

答案 0 :(得分:1)

你正在开始片段,而不是你的活动。

new Intent(view.getContext(), DetalleFragment.class);

但是你不能将context.startActivity用于片段。

如果你想开始你的“ActivityDetalle”,就像我在你的网站上看到的那样 清单,用

替换呼叫
new Intent(view.getContext(), ActivityDetalle.class);

编辑:

如果要从不属于的上下文启动活动 一项活动,您必须添加意图标记Intent.FLAG_ACTIVITY_NEW_TASK

答案 1 :(得分:0)

您的Context c;从未初始化,所以

View v= LayoutInflater.from(c).inflate(R.layout.activity_detalle,parent,false);
            return new NewsViewHolder(v);

返回null

<强>更新

据我了解,您只想将onClickListener分配给某个项目。

创建和设置另一个适配器无法解决您的问题。我会说那是完全错误的方式。

要将onClickListener添加到卡中,您需要修改NewsViewHolder

public NewsViewHolder(View itemView) {
...
itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //your stuff
    }
...
});

<强>更新

不幸的是,stackoverflow是一个可以获得具体问题答案的地方,而不是“我插入一些代码,它仍然不起作用”。这是浪费时间。 首先,您必须学习如何阅读logs and debug

以下是一些资源:

https://www.udacity.com/course/developing-android-apps--ud853 https://commonsware.com/Android/

答案 2 :(得分:0)

通过调用

之类的构造函数初始化适配器中的上下文
public MyAdapter(Context c) {
        this.c=c;

}

并在初始化适配器时调用活动中的构造函数,如

MyAdapter adaoter = new MyAdapter(this);

这样你的Context就不会是空的!