다른 액티비티에서 리스트뷰 아이템 동적으로 추가할때 질문 드립니다.


MainActivity에 listview랑 아이템 추가 버튼을 위치 시켜놓고.

버튼을 누르면 B_Activity (아이템을 추가하는 액티비티 입니다) 로 이동합니다.

B_Activity 에서는 완료버튼 클릭시 해당 view값들을 읽고 MainActivity에 위치한 리스트뷰 아이템을 추가 하고 싶은데.

( 요기서 부터는 그냥 B 와 Main 으로만 적겠습니다.)

B 에서 listview를 findViewById 하고 adapter 랑 연결 ( listview.setAdapter(adapter) ) 할때 listview가 널포인트익셉션이 뜹니다. ㅠㅠ

  • 2016년 09월 01일에 작성됨
    안드로이드 초급 개발자

조회수 218


2 답변


좋아요
1
싫어요
채택취소하기

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;
    }
}
  • 2016년 09월 04일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close