wxx
220
2019-11-11 21:49:33 작성 2019-11-11 21:51:19 수정됨
6
486

리스트로 출력은 어떻게 할 수가 있을까요...



저런식으로 커스텀리스트뷰 데이터를 저장하고 싶은데 어플을 껏다 켜도 남아있게 할려고 합니다.

현재 데이터 저장은 되는 것 같습니다 리스트를 json으로 바꿔서 토스트로 출력 해보니까 저렇게 나오는 거 보니 저장은 되는 것 같습니다 근데 저걸 리스트뷰로 띄우는 걸 잘 모르겠습니다 

 


public class MainActivity extends AppCompatActivity implements Adapter.ListBtnClickListener , AdapterView.OnItemLongClickListener{
        final int INTENT_REQUEST = 1;//인텐트(option 신호값)
        private ListView m_oListView = null;//리스트뷰를 넣기 위한 변수
        private ArrayList<item> list_item = new ArrayList<>();//item 배열
         ArrayList<item> mo;
          Gson gson = new Gson();
          String st;
          EditText text;

     item item_list;
    Adapter oAdapter;
    ImageButton imageButton;

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            SharedPreferences pref = getSharedPreferences("a" , 0);



    String sq = pref.getString("i" , "");
        /////////////////


        text = (EditText) findViewById(R.id.text3);
        Button btn1 = (Button) findViewById(R.id.btn1);//버튼
         imageButton = findViewById(R.id.image);

            btn1.setOnClickListener(new View.OnClickListener() {//+버튼클릭 리스너

                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(getApplicationContext(), option.class);//클릭하면 옵션 액티비티로 넘어감
                    startActivityForResult(intent, INTENT_REQUEST);
                }
            });
        }

    @Override
    protected void onDestroy() {//종료시점(종료시키기)
        super.onDestroy();
        mo = oAdapter.m_oData;
        st =(String)gson.toJson(mo);

        SharedPreferences sharedPreferences = getSharedPreferences("a" , 0);
        SharedPreferences.Editor editor = sharedPreferences.edit();//에디터 연결

        for(int i = 0; i < list_item.size(); i++) {

            editor.putString("i", st);
        }
        editor.commit();//저장하기


    }

    @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {//옵션 액티비티 결과 수신
            super.onActivityResult(requestCode, resultCode, data);

            if (requestCode == INTENT_REQUEST && resultCode == AppCompatActivity.RESULT_OK) {//신호가 ok이고 인텐트 번호가 맞다면

                String name = data.getStringExtra("name");//이름 번호 가져오기
                String number = data.getStringExtra("phone");

              item_list = new item();
                item_list.name = name;
                item_list.number = number;
                list_item.add(item_list);
                //가져온 이름 번호를 아이템객체에 넣기
            }
              oAdapter = new Adapter(list_item, getApplication(), this, R.layout.list_item , imageButton , text);//어댑터 객체 생성

                m_oListView = (ListView) findViewById(R.id.list);//리스트뷰 연결
                m_oListView.setAdapter(oAdapter);//어댑터 장착
                m_oListView.setOnItemLongClickListener(this);


                oAdapter.notifyDataSetChanged();
        }

    @Override
    public void onListBtnClick(int i) {
    }
    @Override
    public boolean onItemLongClick(AdapterView<?> adapterView, View view,  int i, long l) {//길게 클릭하면 삭제하는 버튼
             final int y = i;
        final AlertDialog.Builder dialog = new AlertDialog.Builder(this);
        dialog.setTitle("삭제");
        dialog.setMessage("삭제하시겠습니까?");
        dialog.setPositiveButton("예", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int k) {
                list_item.remove(y);


                Toast.makeText(getApplicationContext() , "삭제되었습니다" , Toast.LENGTH_LONG).show();
                return;
            }
        });
        dialog.setNeutralButton("아니요", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                return;
            }
        });
        dialog.show();

        return false;
    }
}




public class Adapter extends BaseAdapter {

    //BaseAdapter 상속

    public interface ListBtnClickListener {//버튼 클릭 이벤트를 위한 리스너 인터페이스 정의

        void onListBtnClick(int i);
    }


    int resourceId;

    private ListBtnClickListener listBtnClickListener;//생성자로부터 전달된 버튼클릭리스너 저장

    LayoutInflater inflater = null;//xml에 정의된 자원들을 뷰의 형태로 반환
    final public ArrayList<item> m_oData;//item 클래스에 대한 어레이 배열 생성
    private int nListCnt;
    ImageButton imageButton;
    Context com;
    EditText text;

    public Adapter(ArrayList<item> _oData, Context com, ListBtnClickListener clickListener, int resource , ImageButton imageButton , EditText text) {//ArrayList<item>의 배열의 데이터를 m_oData변수에 넣기
        m_oData = _oData;
        nListCnt = m_oData.size();//사이즈
        this.com = com;
       this.listBtnClickListener = clickListener;
        this.resourceId = resource;
        this.imageButton = imageButton;
        this.text = text;
    }

    public ArrayList<item> return_m_oData(){
        return m_oData;
    }





    @Override
    public int getCount() {//아이템이 몇개 그려지는
        return nListCnt;
    }//배열의 사이즈 반환

    @Override
    public Object getItem(int i) {
        return i;
    }//아이템이 어느 인덱스에 있는지 확인

    @Override
    public long getItemId(int i) {
        return i;
    }//아이템 뷰의 아이디를 리턴

    @Override
    public View getView(final int i, View view, final ViewGroup viewGroup) {//목록의 화면 처리를 담당

        if (view == null) {//만약 화면이 안보인다면
            final Context context = viewGroup.getContext();//뷰그룹의 화면값을 가져온다
            if (inflater == null) {//레이아웃인필터가 없을 때 즉 xml자원이 뷰의 형태로 없을 떄
                inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);//인필터값이 없다면 그 자원들을 뷰의 형태로 반환
            }
            view = inflater.inflate(R.layout.list_item, viewGroup, false);//xml로 정의된 뷰를 객체화 시킴
        }
        final TextView name = (TextView) view.findViewById(R.id.text1);//이름 가져옴
        final TextView number = (TextView) view.findViewById(R.id.text2);//번호 가져옴

        name.setText(m_oData.get(i).name);//이름을 텍스트로 가져옴
        number.setText(m_oData.get(i).number);//번호를 텍스트로 가져옴
        imageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view ) {
                String ask = text.getText().toString();

                for(int j = 0; j < m_oData.size(); j++)
                    if (m_oData.get(j).name.equals(ask)) {

                        Intent callIntent=new Intent();
                        callIntent.setAction(Intent.ACTION_CALL);//통화액션
                        callIntent.setData(Uri.parse("tel:" + m_oData.get(j).number));//번호저장
                        com.startActivity(new Intent(callIntent).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));

                    }
                    else{
                        continue;
                    }


            }
        });


        ImageButton img = view.findViewById(R.id.imb2);
        img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


                PermissionListener permissionlistener = new PermissionListener() {
                    @Override
                    public void onPermissionGranted() {//권한허가일경우
                        Toast.makeText(com, "권한 허가", Toast.LENGTH_SHORT).show();


                        Intent callIntent=new Intent();
                        callIntent.setAction(Intent.ACTION_CALL);//통화액션
                        callIntent.setData(Uri.parse("tel:" + m_oData.get(i).number));//번호저장
                        com.startActivity(new Intent(callIntent).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));

                    }

                    @Override
                    public void onPermissionDenied(ArrayList<String> deniedPermissions) {//권한이 거부가 됐을 경우
                        Toast.makeText(com, "권한 거부\n" + deniedPermissions.toString(), Toast.LENGTH_SHORT).show();
                    }


                };

                TedPermission.with(com)

                        .setPermissionListener(permissionlistener)
                        .setRationaleMessage("전화걸기에는 전화권환설정이 필요해요")
                        .setDeniedMessage("왜 거부하셨어요...\n하지만 [설정] > [권한] 에서 권한을 허용할 수 있어요.")
                        .setPermissions(Manifest.permission.CALL_PHONE)
                        .check();


            }

        });

        return view;

    }


}


public class item {
    public String name;//이름
    public String number;//번호
}


0
0
  • 답변 6

  • UnknownDontknow
    494
    2019-11-12 01:10:41

    일단 onActivityResult에 있는 어댑터 생성구문, 리스트뷰 초기화, 어댑터 세팅부분은 모두 onCreate로 옮기셔야 해요.

    지금같은 경우는 onActivityResult가 호출되야만 리스트뷰가 뜨는 형태에요. 뷰 요소 및 데이터 초기화는 onCreate에서 하셔야 해요.

    그리고 어댑터의 생성자 인자값으로 ArrayList<item>이 있지요? 이 값이 리스트뷰에 표시될 값들이니, 토스트에 찍힌 JSON Array를 ArrayList<item>으로 변환하신다음, 어댑터 생성할때 이 값을 넣어주시면 되요. 

    0
  • wxx
    220
    2019-11-12 13:41:08

    @UnknownDontknow 답변 정말 감사합니다 (2,3)번째 코드 같은 경우 저렇게 하면 당연히 리스트뷰는 뜨는데 초기화를 저렇게 하는 건지요... 1번째 코드같은 경우 처음 말을 듣고 저렇게 하는 건 지 알았는데 이름 번호를 저장해쓸때 리스트뷰는 안 뜨더라구요 onActivityResult에 해당 코드는 다 지웠기에 올리지 않았습니다 3,4번째 코드처럼 하라는 건가요 ?

     @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
            item_list = new item();
            item_list.name = name;
            item_list.number = number;
            list_item.add(item_list);
    
            oAdapter = new Adapter(list_item, getApplication(), this, R.layout.list_item , imageButton , text);//어댑터 객체 생성
            m_oListView = setAdapter(oAdapter);
            m_oListView = (ListView) findViewById(R.id.list);//리스트뷰 연결
            m_oListView.setOnItemLongClickListener(this);
    


      @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
            item_list = new item();
    
            oAdapter = new Adapter(list_item, getApplication(), this, R.layout.list_item , imageButton , text);//어댑터 객체 생성
            m_oListView = (ListView) findViewById(R.id.list);//리스트뷰 연결
            m_oListView.setAdapter(oAdapter);//어댑터 장착
            m_oListView.setOnItemLongClickListener(this);
    


       @Override
            protected void onActivityResult(int requestCode, int resultCode, Intent data) {//옵션 액티비티 결과 수신
                super.onActivityResult(requestCode, resultCode, data);
    
                if (requestCode == INTENT_REQUEST && resultCode == AppCompatActivity.RESULT_OK) {//신호가 ok이고 인텐트 번호가 맞다면
    
                   name = data.getStringExtra("name");//이름 번호 가져오기
                    number = data.getStringExtra("phone");
                    item_list.name = name;
                    item_list.number = number;
                    list_item.add(item_list);
                    oAdapter = new Adapter(list_item, getApplication(), this, R.layout.list_item , imageButton , text);//어댑터 객체 생성
                    m_oListView.setAdapter(oAdapter);
    
    
                }


    0
  • UnknownDontknow
    494
    2019-11-12 16:20:43
            item_list = new item();
            item_list.name = name;
            item_list.number = number;
            list_item.add(item_list);

    이 부분 대신 들어가야 될 것이 제가 위에 답변드린 sharedpreference에서 저장한 값들이에요.

    그런데, 옵션액티비티에서 수행하는게 폰에 저장된 모든 사용자들의 전화번호정보를 리스트로 뿌려주는 건가요? 그게 맞다면 startActivityForResult, onActivityResult에 리스트뷰 관련 코드가 들어갈 필요가 없는것이에요. 옵션액티비티에서 sharedpreference에 번호저장하고, 매인엑티비티에서 그값을 받아서 뿌려주면 되거든요.

    코드가 먼가 정리되지않아서 저도 헷갈리는데요, 고쳐야 될 부분을 좀더 짚어드리면, 통화 권한얻는 부분도 어댑터에 작성하지 마시고, 메인액티비티에 작성해서 어플 첫 시작시 권한창띄워서 권한얻는 방식으로 하셔야 해요.

    0
  • wxx
    220
    2019-11-12 16:35:58

    @UnknownDontknow 답변 감사합니다 ㅠㅠㅠㅠ 그럼 옵션액티비티에서 수행하는 게 저장할때마다 리스트뷰가 하나씩 추가되는 거라면 startActivityForResult , onActivityResult에 리스트뷰 관련 코드가 들어가는 뜻으로 받아들여도 되나요 ???

    초보라서 조금 답답할수도 있겠지만 차근차근 설명해주셔서 감사합니다 

    0
  • UnknownDontknow
    494
    2019-11-12 17:09:05

    sharedpreference 를 사용하시려는 것이면 startActivityForResult , onActivityResult 에서는 권한수행코드만 있으면 되구 리스트뷰 관련 코드는 onCreate에서 하시면 되는것이죠. 제 생각에 startActivityForResult, onActivityResult는 전화권한 때문에 쓰시는것같은데, 그부분에 리스트뷰관련 코드가 들어갈 필요가 없거든요. 디스코드로 채팅가능하시면 방만들고 알려주시면 빠르게 도와드릴 수 있을것 같습니다. 

    0
  • wxx
    220
    2019-11-13 14:46:57

    #UnknownDontknow https://discord.gg/eFRDPb 디스코드 만들었습니다 혼자 해볼려고 했는데 잘 안됩니다 ㅠㅠ 

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.