我想使用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();
}
}
}
}
答案 0 :(得分:0)
尝试:
在适配器类中添加方法
class SmsNumberAdapter //Adapter class{
public void addData(modelModel){
modelList.add(model)
notifyDataSetChanged()
}
}
现在在asynctask
adapter.addData(smsNumber)