마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

listview에 관련해서 질문합니다.

0 추천
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if(position == (helper.Static_Request_MakeInfo.size() - 1)){
                main.send_toServer("REQUEST_ROOM_INFO/"+helper.Static_Request_MakeInfo.size());
                new Dialog_AsyncTask(getContext()).execute("");
                notifyDataSetChanged();
            }

안녕하세요.

현재 listview에서 목록을 보여주다가 맨아래에있는 listview에 position이 도착하면

main.send_toserver를 이용해서 데이터를 요청하고 dialog_asyncTask를 만들어서 while문으로 기다리다가

데이터가 도착하면 notifyDataSetChanged하게끔 만들고싶은데요.

 

우선 데이터는 잘 도착하고 progressDialog도 잘 동작합니다.

하지만 문제가

1. 데이터스택이 쌓이긴하는데 이게 notifysetchanged가 안된다는것과.

2. send_toServer로 보내는 메시지가 두번찍힌다는것입니다.

코딩하다보니 왠지모르겠는데 4번찍혀버릴때도 있더군요.. 현재 코딩상태로는 2번이 계속찍히고

다이얼로그가 돌아간뒤에 다이얼로그가 사라지고 그상태를 그대로 유지합니다.

따라서 다른곳을 갔다가 oncreat시키면 모든 데이터가 다시보이게되구요.

 

이걸 메시지를 한번만 보내고,

progressdialog가 사라진뒤에 바로 갱신할 수 없을까요??

 

아래는 AsyncTask 클래스입니다.

 

class Dialog_AsyncTask extends android.os.AsyncTask<String  //excute 실행시 넘겨줄 데이터 타입
        ,  String //진행정보 데이터 타입,publishProgress(), onProgressUpdata 의 인수
        ,  Integer //doInbackground()종료시 리턴될 데이터 타입 onPostExecute()의 인수
        > {
    private ProgressDialog progressDialog;
    private Context mContext;
    class main extends MainActivity{}
    main m = new main();

    public Dialog_AsyncTask(Context context){
        mContext = context;
    }

    @Override
    protected void onPreExecute() {
        progressDialog = new ProgressDialog(mContext);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressDialog.setTitle("Loading.......");
        progressDialog.setMessage("서버로 부터 데이터 전송중");
        progressDialog.setCancelable(false);
        progressDialog.show();

        super.onPreExecute();
    }

    @Override
    protected Integer doInBackground(String... params) {
        while(true){
            System.out.println(helper.arriveVector);
            if(helper.arriveVector){
                break;
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(Integer integer) {
        progressDialog.dismiss();
        super.onPostExecute(integer);
    }
}

 

 

항상 질문에 답해주셔서 정말정말 감사합니다.

gsm2055 (260 포인트) 님이 2016년 8월 31일 질문
소스로 보아서는 pull to refresh 패턴을 구현하시는 것 같이 보이네요. 이 기능은 이미 안드로이에 컴포넌트로 제공되는 기능입니다. 이미 기본으로 제공되는 컴포넌트를 재개발 하실 필요는 없다고 생각합니다. 이미 검증된 것을 사용하는 것이 best practice라고 생각합니다. 그리고 어떻게 구현이 되었는지 보시려면 소스를 확인해 보시면 될 것 같습니다. 이거 말고도 GitHub에 이미 잘 구현된 오픈소스들이 존재합니다. 이것들도 참고하시면 좋을 것 같습니다.
항상 감사합니다 ~ pull to refresh라는 기능이 이미 있었군요..
독학으로 공부하고 개발하는 것이라 그런지 전문적인 내용에 대해서는 지식이 짧네요..

답변에 감사드립니다 ^^ pull to refresh 에 대해서 공부해봐야겠네요!

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...