屏幕转换不起作用

时间:2018-02-09 11:32:00

标签: android notifydatasetchanged

我想使用notifyDataSetChanged更新屏幕。但我不会这样做。

数据进入数据库。但屏幕不会改变。当我再试一次时,

屏幕更改。我认为问题在于它运行的情况。什么时候

我应该开始吗?

我正在使用对话框。我在对话框中输入了数据。并且在Asynctask中执行了notifyDataSetChanged。

 public class MainActivity extends AppCompatActivity {
        private Spinner spinner;
        private String userPassword;
        private String userGender;
        private String userMajor;
        private String userEmail;
        private AlertDialog dialog;  //알림창을 보여줌
        private boolean validate = false;  //사용할 수 있는 회원 아이디인지 체크
        private static String userID = "a";//연결하면 메인에서 아이디를 받아와야함.
        private TextView userIDtext;//목록에 대한 안내가 있는 텍스트
        private ListView smsNumberViewList;//전화번호가 기록되는 리스트뷰
        private SmsNumberAdapter adapter;//
        private List<SmsNumber> smsNumberList;

       //sms등록 할떄 묻는 다이얼로그들
        private Dialog smsInsertDialog;
        private Button dialog_reg;
        private Button dialog_cancel;
        private TextView dialog_text;
        private String smsNumCountCheck;

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

            smsNumberViewList=(ListView)findViewById(R.id.smsNumberViewList);
            smsNumberList = new ArrayList<SmsNumber>();

            userIDtext=(TextView)findViewById(R.id.userIDtext);
            userIDtext.setText(userID+"님이 등록한 비상연럭처");  //알림 글

            //adapter는 해당 List를 매칭 (각각 차례대로 매칭)
            adapter = new SmsNumberAdapter(getApplicationContext(),smsNumberList);
            smsNumberViewList.setAdapter(adapter);

            ((Button) findViewById(R.id.click)).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    //등록 버튼을 눌렀을 떄  다이얼 로그 창이 나옴.
                    smsInsertDialog = new Dialog(MainActivity.this);
                    smsInsertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                    //다이얼로그 화면 구성하기.
                    smsInsertDialog.setContentView(R.layout.smsinsertdialog);
                    dialog_reg=(Button)smsInsertDialog.findViewById(R.id.dialog_reg);
                    dialog_cancel=(Button)smsInsertDialog.findViewById(R.id.dialog_cancel);

                    dialog_reg.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                           /* if(smsNumberList.){
                                //다이얼로그 종료
                                smsInsertDialog.dismiss();
                            }*/

                            Response.Listener<String> responseListener = new Response.Listener<String>() {

                                @Override
                                public void onResponse(String response) {

                                    // 해당 웹사이트에 접속한 뒤 특정한 response(응답)을 다시 받을 수 있도록 한다
                                    try {
                                        JSONObject jsonResponse = new JSONObject(response);
                                        boolean success = jsonResponse.getBoolean("success");

                                        // 만약 사용할 수 있는 아이디라면
                                        if (success) {
                                            Toast.makeText(MainActivity.this, "success", Toast.LENGTH_LONG).show();
                                        }

                                        // 중복체크 실패 (사용할 수 없는 아이디)
                                        else {
                                            Toast.makeText(MainActivity.this, "failed", Toast.LENGTH_LONG).show();
                                        }
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }
                                }
                            };


                            // 실질적으로 접속할 수 있도록 생성자를 통해 객체를 만든다. (유저 ID, responseListener)
                            // ValidateRequest.java라는 파일을 만들어야 한다.
                            smsDB_Manager smsRequest = new smsDB_Manager(userID, ((EditText) findViewById(R.id.smsNum1)).getText().toString(), ((EditText) findViewById(R.id.numsName)).getText().toString(), responseListener);
                            RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
                            queue.add(smsRequest);  //준비된 데이터를 받아 통신을 시작한다.
                            queue.start();

                            new BackgroundTask().execute();//등록 버튼을 누르면 리스트 스레드를 돌려서 리스트를 만들어줌.

                            Toast.makeText(getApplicationContext(),"등록되었습니다.",Toast.LENGTH_SHORT).show();


                               //다이얼로그 종료
                               smsInsertDialog.dismiss();

                        }
                    });


                    //취소하면 그냥 취소됐다는 걸 알리는 토스트창 하나 띄워주고 종료함.
                    dialog_cancel.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            //취소시에 종료 토스트 출력하기.
                            Toast.makeText(getApplicationContext(),"취소되었습니다.",Toast.LENGTH_SHORT).show();

                            //다이얼로그 종료
                            smsInsertDialog.dismiss();
                        }
                    });


                    //다이얼로그 화면에 보여주기
                    smsInsertDialog.show();

                }
                                        }
            );





            new BackgroundTask().execute();

        }
class BackgroundTask extends AsyncTask<Void, Void, String> {
        // (로딩창 띄우기 작업 3/1) 로딩창을 띄우기 위해 선언해준다.
        ProgressDialog dialog = new ProgressDialog(MainActivity.this);

        String target;  //우리가 접속할 홈페이지 주소가 들어감

        @Override
        protected void onPreExecute() {
            target = "http://ggavi2000.cafe24.com/smsList.php?userID="+ userID;  //해당 웹 서버에 접속

            // (로딩창 띄우기 작업 3/2)
            dialog.setMessage("로딩중");
            dialog.show();
        }  @Override
        protected String doInBackground(Void... voids) {
            try {

                // 해당 서버에 접속할 수 있도록 URL을 커넥팅 한다.
                URL url = new URL(target);
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

                // 넘어오는 결과값을 그대로 저장
                InputStream inputStream = httpURLConnection.getInputStream();

                // 해당 inputStream에 있던 내용들을 버퍼에 담아서 읽을 수 있도록 해줌
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

                // 이제 temp에 하나씩 읽어와서 그것을 문자열 형태로 저장
                String temp;
                StringBuilder stringBuilder = new StringBuilder();

                // null 값이 아닐 때까지 계속 반복해서 읽어온다.
                while ((temp = bufferedReader.readLine()) != null) {
                    // temp에 한줄씩 추가하면서 넣어줌
                    stringBuilder.append(temp + "\n");
                }

                // 끝난 뒤 닫기
                bufferedReader.close();
                inputStream.close();
                httpURLConnection.disconnect();  //인터넷도 끊어줌
                return stringBuilder.toString().trim();
            } catch (Exception e) {
                e.printStackTrace();
            }

            return null;
        }
        @Override
        public void onProgressUpdate(Void... values) {
            super.onProgressUpdate();
        }

        @Override  //해당 결과를 처리할 수 있는 onPostExecute()
        public void onPostExecute(String result) {
            try {
                // 해당 결과(result) 응답 부분을 처리
                JSONObject jsonObject = new JSONObject(result);

                // response에 각각의 공지사항 리스트가 담기게 됨
                JSONArray jsonArray = jsonObject.getJSONArray("response");  //아까 변수 이름

                int count = 0;
                String userID,numsName;
                String smsNum1;
                while (count < jsonArray.length()) {
                    // 현재 배열의 원소값을 저장
                    JSONObject object = jsonArray.getJSONObject(count);

                    // 공지사항의 Content, Name, Date에 해당하는 값을 가져와라는 뜻

                    userID = object.getString("userID");
                    smsNum1 = object.getString("smsNum1");
                    numsName = object.getString("numsName");
                    // 하나의 공지사항에 대한 객체를 만들어줌
                    SmsNumber smsNumber = new SmsNumber(userID, smsNum1,numsName);

                    smsNumCountCheck=smsNum1;
                    //리스트에 추가해줌
                    smsNumberList.add(smsNumber);

                    adapter.notifyDataSetChanged();

                    count++;
                }


                // (로딩창 띄우기 작업 3/3)
                // 작업이 끝나면 로딩창을 종료시킨다.
                dialog.dismiss();

            } catch (Exception e) {
                e.printStackTrace();
            }


        }
    }
}

1 个答案:

答案 0 :(得分:0)

尝试:

在适配器类中添加方法

class SmsNumberAdapter //Adapter class{
public void addData(modelModel){
modelList.add(model)
notifyDataSetChanged()
}
}

现在在asynctask

adapter.addData(smsNumber)