【问题标题】:Sending and receiving arraylist from one activity to another从一个活动向另一个活动发送和接收arraylist
【发布时间】:2019-10-05 16:33:07
【问题描述】:

我正在尝试将一个 ArrayList 从 NoteActivity 发送到 MainActivity。

ArrayList<String> data = new ArrayList<String>();

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

  final FloatingActionButton button = 
     (FloatingActionButton)findViewById(R.id.save_button);

  button.setOnClickListener(new View.OnClickListener() 
   {

     @Override
     public void onClick(View v) 
     {
       SaveData();
     }
   });
}

public void SaveData()
{
   FileOutputStream outputStream;

   try 
   {
     EditText editText = findViewById(R.id.textView3);

     final String str = editText.getText().toString();

     String content = findViewById(R.id.textView).toString();
     Log.d("Test","inside try block");

     outputStream = openFileOutput(str, Context.MODE_PRIVATE);
     outputStream.write(content.getBytes());

     Toast.makeText(getApplicationContext(),"Note 
     saved",Toast.LENGTH_SHORT).show();

     Log.d("Test","save done");

     final String str1 = editText.getText().toString();
     data.add(str1);

     SendData();
   }
   catch (FileNotFoundException e)
   {
       e.printStackTrace();
   }
   catch (IOException e)
   {
       e.printStackTrace();
   }
}

   public void SendData()
   {
      EditText editText = findViewById(R.id.textView3);

      Log.d("Check","str:"+data);
      Intent intent = new Intent(NotePad.this,MainActivity.class);
      intent.putExtra(EXTRA_MESSAGE, data);
      startActivity(intent);
   }
}

My Main Activity

public class MainActivity extends AppCompatActivity 
{
   private RecyclerView recyclerView;
   private RecyclerView.Adapter mAdapter;
   private RecyclerView.LayoutManager layoutManager;
   ArrayList<String> notes = new ArrayList<String>();




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


      Intent intent = getIntent();
      notes = intent.getStringArrayListExtra(NotePad.EXTRA_MESSAGE);

      Log.d("Check","title added: "+notes);


      final FloatingActionButton button = 
       (FloatingActionButton)findViewById(R.id.add_notebutton);


      button.setOnClickListener(new View.OnClickListener() 
      {

         @Override
         public void onClick(View v) 
         {
             Intent intent = new Intent(MainActivity.this,NotePad.class);
             startActivity(intent);
         }
      });

      recyclerView = (RecyclerView)findViewById(R.id.recycle_list);


      layoutManager = new LinearLayoutManager(this);
      recyclerView.setLayoutManager(layoutManager);
      mAdapter = new MyAdapter(notes);
      recyclerView.setAdapter(mAdapter);

   }

}

my Adapter code

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> 
{

  ArrayList<String> Notes_list = new ArrayList<String>();

   public MyAdapter(ArrayList<String> notes)
   {
      Notes_list = notes;
   }

   @NonNull
   @Override
     public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int 
     viewType) 
   {
     LayoutInflater inflater = LayoutInflater.from(parent.getContext());
      View view = inflater.inflate(R.layout.list_items,parent,false);
      return new MyViewHolder(view);
   }

   @Override
   public void onBindViewHolder(@NonNull MyViewHolder holder, int position) 
   {

       holder.mTextView.setText(Notes_list.get(position));
   }

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

   public class MyViewHolder extends RecyclerView.ViewHolder 
   {
       TextView mTextView;
       public MyViewHolder(@NonNull View itemView)
       {
          super(itemView);
          mTextView = (TextView) itemView.findViewById(R.id.view_holder);
       }
   }
}

我的笔记 (arrayList) 中没有收到任何数据。当我运行代码时

应用程序立即崩溃并出现空指针异常。

错误:java.lang.NullPointerException:尝试调用虚拟方法'int java.util.ArrayList.size()' 在空对象引用上 com.example.quicknote.MyAdapter.getItemCount(MyAdapter.java:39)

【问题讨论】:

  • edit您的问题并格式化您的代码,这很难阅读。去掉开头的反引号。将代码缩进 4 个空格或单击 {} 按钮。通过在块中缩进代码来修复格式。

标签: android android-intent


【解决方案1】:

您正在尝试传递 ArrayList 并使用 getStringArrayListExtra 方法从意图中读取数据。您必须像这样放置数据:

intent.putStringArrayListExtra(EXTRA_MESSAGE, data);

编辑:检查意图是否有键:

if (intent.hasExtra(NotePad.EXTRA_MESSAGE)) {
    notes = intent.getStringArrayListExtra(NotePad.EXTRA_MESSAGE);
}

注意:如果这只是一个游乐场,也可以。但如果你试图 构建一些东西然后你的架构是错误的。这不是一个好主意 每次在两个活动之间传递相同的数组。您可以使用 startActivityForResult 方法并获取新注释 onActivityResult 方法 MainActivity 的。

【讨论】:

  • 同样的错误:尝试在 com.example.quicknote.MyAdapter.getItemCount(MyAdapter.java:39) 的空对象引用上调用虚拟方法 'int java.util.ArrayList.size()'
  • 因为最初您的 MainActivity 启动并且没有从记事本传递任何意图。查看更新的答案。
【解决方案2】:

试试这个:-

Intent intent = new Intent(NotePad.this,MainActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("EXTRA_MESSAGE", data);
intent.putExtras(bundle);

//in MainActivity.class
Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
ArrayList<String> data=(ArrayList<String>)bundle.getSerializable("EXTRA_MESSAGE");

【讨论】:

    【解决方案3】:

    在 android 文档中给出的将 arraylist 或任何自定义对象从一个活动发送到另一个活动以在 android 中尝试轻量级过程的最佳方式

    阅读关于它的完整概述https://developer.android.com/reference/android/os/Parcelable

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2014-02-20
      • 1970-01-01
      • 2013-04-07
      • 2015-07-20
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多