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

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

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

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

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

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

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;
        }
    }
    

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.