android - RecyclerView中如何实现StartActivityForResult

标签 android android-recyclerview startactivityforresult

我正在尝试在我的 RecyclerView 中使用 startActivityForResult 并且不知道如何...尝试这种方式并且我从 Activity 获得了 NullPointExeption,有什么办法可以解决它。

这是 Activity :

    RecyclerView recyclerView=findViewById(R.id.todo_Recyclerview);
    Todo_Adapter adapter=new Todo_Adapter(this,Todo_DataGenerator.getData(this));
    recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
    recyclerView.setAdapter(adapter);
}

TextView title=findViewById(R.id.todo_txt_Titleitem);
TextView content=findViewById(R.id.todo_txt_Contentitem);


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);


    if (requestCode== Request &&
            resultCode==RESULT_OK &&
            data !=null){

        String Title=data.getStringExtra(Todo_saveActivity.Todo_Title);
        String Content=data.getStringExtra(Todo_saveActivity.Todo_Content);

        title.setText(Title);
        content.setText(Content);

这是适配器:

public class Todo_Adapter extends RecyclerView.Adapter<Todo_Adapter.Todo_itemViewHolder> {
public static final int Request = 1002;

private Context context;
private List<Todo_SampleClass> Notes;



public Todo_Adapter(Context context, List<Todo_SampleClass> Notes) {

    this.context = context;
    this.Notes = Notes;

}

@Override
public Todo_itemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater layoutInflater = LayoutInflater.from(context);
    View view = layoutInflater.inflate(R.layout.todo_rv_item, parent, false);
    return new Todo_itemViewHolder(view);

}


@Override
public void onBindViewHolder(Todo_itemViewHolder holder, int position) {
    holder.bindNotes(Notes.get(position));
    holder.Add.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent=new Intent(context, Todo_saveActivity.class);
            ((Activity) context).startActivityForResult(intent,Request);

        }
    });

}


@Override
public int getItemCount() {
    return Notes.size();
}

public class Todo_itemViewHolder extends RecyclerView.ViewHolder {

    private TextView Title;
    private TextView Content;
    private ImageButton edit;
    private ImageButton remove;
    private Button Add;

    public Todo_itemViewHolder(View itemView) {
        super(itemView);
        Title = itemView.findViewById(R.id.todo_txt_Titleitem);
        Content = itemView.findViewById(R.id.todo_txt_Contentitem);
        edit = itemView.findViewById(R.id.todo_btn_edit);
        remove = itemView.findViewById(R.id.todo_btn_remove);
        Add = itemView.findViewById(R.id.todo_btn_add);

    }


    public void bindNotes(Todo_SampleClass Notes) {
        Title.setText(Notes.getTitle());
        Content.setText(Notes.getContent());
        edit.setImageDrawable(Notes.getImgbtn_edit());

        remove.setImageDrawable(Notes.getImgbtn_remove());
    }

    }

}

这是我尝试进行的第二个 Activity:

public class Todo_saveActivity extends AppCompatActivity {


public static final String Todo_Title ="result";
public static final String Todo_Content="content";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_todo_save);


    final EditText Title=findViewById(R.id.todo_name);
   final EditText Content=findViewById(R.id.todo_family);

这是 logcat:

  java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.expert2.expert2/com.example.expert2.expert2.rv_Todo.Todo_rv}: java.lang.NullPointerException
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2137)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
                  at android.app.ActivityThread.access$600(ActivityThread.java:141)
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
                  at android.os.Handler.dispatchMessage(Handler.java:99)
                  at android.os.Looper.loop(Looper.java:137)
                  at android.app.ActivityThread.main(ActivityThread.java:5103)
                  at java.lang.reflect.Method.invokeNative(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:525)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
                  at dalvik.system.NativeStart.main(Native Method)
               Caused by: java.lang.NullPointerException
                  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.AppCompatDelegateImplV11.<init>(AppCompatDelegateImplV11.java:29)
                  at android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.java:54)
                  at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:202)
                  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.example.expert2.expert2.rv_Todo.Todo_rv.<init>(Todo_rv.java:29)
                  at java.lang.Class.newInstanceImpl(Native Method)
                  at java.lang.Class.newInstance(Class.java:1130)
                  at android.app.Instrumentation.newActivity(Instrumentation.java:1061)

谢谢。-------------------------------------------- ----------------------

最佳答案

查看这段代码时:

public static final int Request = 1002;

 @Override
public void onBindViewHolder(Todo_itemViewHolder holder, int position) {
    holder.bindNotes(Notes.get(position));
    holder.Add.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent=new Intent(context, Todo_saveActivity.class);
            ((Activity) context).startActivityForResult(intent,Request);

        }
    });

}

在我看来,((Activity) context) 似乎是问题所在。您正在尝试使用为空的 Activity 对象调用 startActivityForResult(...)。根据您的 RecyclerView 是在 Activity 还是 Fragment 中,确保将 context 设置为等于父 Activity 上下文的有效实例,例如:

Context context = getContext(); //if in fragment
Context context = (Context)this; //if in parent activity

稍后你应该可以调用

((Activity) context).startActivityForResult(intent,Request);

没有任何问题。

关于android - RecyclerView中如何实现StartActivityForResult,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48696477/

相关文章:

java - Lombok 如何将代码生成到现有类中?

android - fragment 中 RecyclerView 上的 SearchView

java - startActivityForResult 返回错误的 Activity

android - 通知监听器的 startActivityForResult

android - Android fragment 中的 startActivityForResult() 与 getActivity().startActivityForResult()

android - 从 Recyclerview 保存复选框状态

java - 格式化日历对象时出现非法参数异常

android - 将Android SDK从29降级到21

android - 更新recyclerview中的值

android - 添加项目后,Recyclerview 将索引绑定(bind)到列表大小之外