다른 액티비티에서 리스트뷰 아이템 동적으로 추가할때 질문 드립니다.
조회수 5439회
MainActivity에 listview랑 아이템 추가 버튼을 위치 시켜놓고.
버튼을 누르면 B_Activity (아이템을 추가하는 액티비티 입니다) 로 이동합니다.
B_Activity 에서는 완료버튼 클릭시 해당 view값들을 읽고 MainActivity에 위치한 리스트뷰 아이템을 추가 하고 싶은데.
( 요기서 부터는 그냥 B 와 Main 으로만 적겠습니다.)
B 에서 listview를 findViewById 하고 adapter 랑 연결 ( listview.setAdapter(adapter) ) 할때 listview가 널포인트익셉션이 뜹니다. ㅠㅠ
-
(•́ ✖ •̀)
알 수 없는 사용자
2 답변
-
B 액티비티에서 findViewById() 함수를 통해 메인 액티비티의 listView에 접근했다는 얘기인가요? 그런식으로는 접근할 수 없습니다. B에서 완료 버튼 클릭 시 선택된 아이템들, 즉 데이터를 메인 액티비티로 전달해야 합니다. 다음 링크의 글들을 한번 읽어보세요.
과정을 간단하게 설명하면 메인 액티비티에서 B 액티비티를 실행할 때, startActivityForResult()로 실행을 하고, B에서는 완료 버튼 클릭 시 데이터를 Intent에 담아서 setResult(RESULT_OK, intent)와 finsh()를 호출합니다. 메인 액티비티에서는 onActivityResult() 함수를 통해서 B 액티비티의 결과를 수신할 수 있습니다. onActivityResult()로 수신된 데이터를 listView에 추가하고 갱신하면 됩니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
-
한로니로니 님께서 말씀하신 방법 코드 첨부합니다 .
[MainActivity.class]
public static List<String> list; private ArrayAdapter simpleAdapter; private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); list = new ArrayList<>(); list.add("MainActivity의 static 변수를 이용"); list.add("ActivityForResult() 메서드를 이용"); listView = (ListView)findViewById(R.id.list); simpleAdapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,list); listView.setAdapter(simpleAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { switch (position){ case 0: Intent intent1 = new Intent(MainActivity.this,B_Activity.class); intent1.putExtra("request",0); startActivity(intent1); break; case 1: Intent intent2 = new Intent(MainActivity.this,B_Activity.class); intent2.putExtra("request",1); startActivityForResult(intent2,0); break; default: break; } } }); } @Override protected void onResume() { super.onResume(); simpleAdapter.notifyDataSetChanged(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { String response = data.getStringExtra("data"); list.add(response); simpleAdapter.notifyDataSetChanged(); }
[B_Activity.class]
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_b); int request = getIntent().getIntExtra("request", -1); Button button = (Button) findViewById(R.id.button); switch (request) { case 0: button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MainActivity.list.add("AAAAAA"); //MainActivity의 static 메모리 변수에 list에 데이터 추가 finish(); // 액테비티가 종료되면 MainAcitivity의 onResume 메서드가 실행되면서 리스트를 dataSetChange메서드를 이용해서 list를 갱신합니다. } }); break; case 1: button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.putExtra("data", "BBBBBB"); setResult(0, intent); finish(); // 액테비티가 종료되면 MainAcitivity의 onResume 메서드가 실행되면서 리스트를 dataSetChange메서드를 이용해서 list를 갱신합니다. } }); break; } }
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력