서버에서 받아온 값 리스트에 저장하고 검색하기

조회수 797회

서버에서 값을 받아오는건 확인했는데 저기 Asynctask에서 추가한 항목이 검색기능에 잡히지를 않네요..ㅠㅠ onCreate에 list.add("항목") 이런식으로 추가해주면 문제 없이 하는데 Asynctask에서는 이런 문제를 어떻게 해결해야 하는지 모르겠습니다..ㅠㅠ

onCreate부분 입니다.

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

        editSearch = (EditText) findViewById(R.id.address_group_edtadd);
        listView = (ListView) findViewById(R.id.address_group_addlist);

        list = new ArrayList<>();
        Tablename = new ArrayList<>();
        // 리스트를 생성한다.

        //서버 전송 class
        InsertData task = new InsertData();
        task.execute("serverURL");

        // 검색에 사용할 데이터을 미리 저장한다.
        //settingList();

        // 리스트의 모든 데이터를 arraylist에 복사한다.// list 복사본을 만든다.
        arraylist = new ArrayList<String>();
        arraylist.addAll(list);

        // 리스트에 연동될 아답터를 생성한다.
        adapter = new AddressGroupAdapter(list, this);

        // 리스트뷰에 아답터를 연결한다.
        listView.setAdapter(adapter);

        // input창에 검색어를 입력시 "addTextChangedListener" 이벤트 리스너를 정의한다.
        editSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

            @Override
            public void afterTextChanged(Editable editable) {
                // input창에 문자를 입력할때마다 호출된다.
                // search 메소드를 호출한다.
                String text = editSearch.getText().toString();
                search(text);
            }
        });
    }

이부분이 서버에서 값을 받아오는 부분입니다.

class InsertData extends AsyncTask<String, Void, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);

        try {
            JSONObject Land = new JSONObject(result);
            JSONArray jsonArray = Land.getJSONArray("Response");
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject subJsonObject = jsonArray.getJSONObject(i);
                String TableName = subJsonObject.getString("serverURL");
                Tablename.add(TableName);
                namelist = Tablename.get(i);
                list.add(TableName); //서버에서 받은 값을 list에 추가
            }
        } catch (JSONException e) {
            e.printStackTrace();
            }
        }
    }



  • "Asynctask에서 추가한 항목"이라는게 InsertData 클래스를 말씀하시는건지... 편집요청빌런 2020.1.31 09:37
  • 넵! InsertData 클래스에서 list에 추가를 한게 뜨는데 알 수 없는 사용자 2020.1.31 13:15
  • ㄱ검색 기능을 사용해서 검색을 하려 하면 아무것도 안나와 버립니다.. 알 수 없는 사용자 2020.1.31 13:15
  • 그냥 onCreat에 똑같은 값을 넣어줬을때는 잘 동작하구요! 알 수 없는 사용자 2020.1.31 13:15
  • 제가 글 수정 제안하면서 원문 내용을 날려버렸네요;;; 다음은 날려먹은 부분입니다: 서버에서 값을 받아오는건 확인했는데 저기 Asynctask에서 추가한 항목이 검색기능에 잡히지를 않네요..ㅠㅠ onCreate에 list.add("항목") 이런식으로 추가해주면 문제 없이 하는데 Asynctask에서는 이런 문제를 어떻게 해결해야 하는지 모르겠습니다..ㅠㅠ 편집요청빌런 2020.1.31 13:30

1 답변

  • 소스만 보고 추측해보자면... AsyncTask에서 데이터를 불러와서 list에 담기 전에 메인쓰레드에서 list가 Adapter에 담겨서 리스트뷰에 바인딩 되는 것 같습니다.

    adapter = new AddressGroupAdapter(list, this);

    listView.setAdapter(adapter);

    두 행을 onPostExecute안에 넣어보면 되지 않을까 싶은데요.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)