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

ListFragment를 이용해서 json으로 받은 데이터를 adapter로 커스텀 리스트뷰 만드는 방법

0 추천

ListFragment를 이용해서 json으로 받은 데이터를 adapter로 커스텀 리스트뷰를 만들려고 하는데 로그로 디비에서 데이터를 가져오는거 까지는 되는데 저장이랑 화면에 뿌려주는게 왜 안되는지 모르겠네요 ㅠㅠ

로그로 찍어보니까 count가 0이 찍히는건 데이터가 안들어가는거겠죠??

json에서 데이터를 가져와서 넣어주는 소스입니다.

public class StunoteFragment extends ListFragment {
    private String url = "ip주소";
    private  String jsonResult;

    ListViewAdapter adapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        // Adapter 생성 및 Adapter 지정.
        adapter = new ListViewAdapter() ;

        JsonReadTask task = new JsonReadTask();
        setListAdapter(adapter) ;
        task.execute(url);

        Log.e("msg",adapter.getCount()+"");

        return super.onCreateView(inflater, container, savedInstanceState);
    }


    private class JsonReadTask extends AsyncTask<String,Void,String> {
        String errorString = null;

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

        }


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



            try{
                JSONObject jsonResponse = new JSONObject(result);
                JSONArray jsonMainNode = jsonResponse.optJSONArray("major_document");

                for(int i = 0;i<jsonMainNode.length();i++)
                {
                    JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);//json 형식으로 오브젝트하나를 받아와서 '제목만'받아옴
                    String md_srl = jsonChildNode.optString("module_srl");
                    String title = jsonChildNode.optString("title");
                    String content = jsonChildNode.optString("content");
                    int readed_count = jsonChildNode.optInt("readed_count");
                    String regDate = jsonChildNode.optString("regdate");
                    adapter.addItem(title,content,regDate,readed_count) ;

                }
            }catch(JSONException e){
                Toast.makeText(getContext().getApplicationContext(),"Error" + e.toString(),Toast.LENGTH_SHORT).show();
            }


        }


        @Override
        protected String doInBackground(String... params) {

            String serverURL = params[0];


            try {

                URL url = new URL(serverURL);
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();


                httpURLConnection.setReadTimeout(5000);
                httpURLConnection.setConnectTimeout(5000);
                httpURLConnection.connect();


                int responseStatusCode = httpURLConnection.getResponseCode();

                InputStream inputStream;
                if(responseStatusCode == HttpURLConnection.HTTP_OK) {
                    inputStream = httpURLConnection.getInputStream();
                }
                else{
                    inputStream = httpURLConnection.getErrorStream();
                }


                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

                StringBuilder sb = new StringBuilder();
                String line;

                while((line = bufferedReader.readLine()) != null){
                    sb.append(line);
                }


                bufferedReader.close();


                return sb.toString().trim();


            } catch (Exception e) {
                errorString = e.toString();

                return null;
            }

        }
    }
}

이건 Adapter소스입니다

public class ListViewAdapter extends BaseAdapter{
    // Adapter에 추가된 데이터를 저장하기 위한 ArrayList
    private ArrayList<ListViewItem> listViewItemList = new ArrayList<ListViewItem>() ;

    // ListViewAdapter의 생성자
    public ListViewAdapter() {

    }

    // Adapter에 사용되는 데이터의 개수를 리턴. : 필수 구현
    @Override
    public int getCount() {
        return listViewItemList.size() ;
    }

    // position에 위치한 데이터를 화면에 출력하는데 사용될 View를 리턴. : 필수 구현
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final int pos = position;
        final Context context = parent.getContext();

        // "listview_item" Layout을 inflate하여 convertView 참조 획득.
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.stunote_content, parent, false);
        }

        // 화면에 표시될 View(Layout이 inflate된)으로부터 위젯에 대한 참조 획득
        TextView titleTextView = (TextView) convertView.findViewById(R.id.Stu_notepad_title) ;
        TextView descTextView = (TextView) convertView.findViewById(R.id.Stu_notepad_content) ;
        TextView regDate = (TextView) convertView.findViewById(R.id.Stu_notepad_date);
        TextView readedCount = (TextView) convertView.findViewById(R.id.Stu_notepad_view);

        // Data Set(listViewItemList)에서 position에 위치한 데이터 참조 획득
        ListViewItem listViewItem = listViewItemList.get(position);

        // 아이템 내 각 위젯에 데이터 반영
        titleTextView.setText(listViewItem.getTitle());
        descTextView.setText(listViewItem.getDesc());
        regDate.setText( listViewItem.getRegDate());
        readedCount.setText(listViewItem.getReadedCount());


        return convertView;
    }

    // 지정한 위치(position)에 있는 데이터와 관계된 아이템(row)의 ID를 리턴. : 필수 구현
    @Override
    public long getItemId(int position) {
        return position ;
    }

    // 지정한 위치(position)에 있는 데이터 리턴 : 필수 구현
    @Override
    public Object getItem(int position) {
        return listViewItemList.get(position) ;
    }

    // 아이템 데이터 추가를 위한 함수. 개발자가 원하는대로 작성 가능.
    public void addItem(String title, String desc, String regDate, int readedCount) {
        ListViewItem item = new ListViewItem();

        item.setTitle(title);
        item.setDesc(desc);
        item.setRegDate(regDate);
        item.setReadedCount(readedCount);

        listViewItemList.add(item);

    }


}
public class ListViewItem {
    private String titleStr ;
    private String contextStr ;
    private String regDate;
    private int readedCount;

    public void setTitle(String title) {
        titleStr = title ;
    }
    public void setDesc(String desc) {
        contextStr = desc ;
    }
    public void setRegDate(String regDate){
        this.regDate = regDate;
    }
    public void setReadedCount(int count){
        readedCount = count;
    }

    public String getTitle() {
        return this.titleStr ;
    }
    public String getDesc() {
        return this.contextStr ;
    }
    public String getRegDate(){
        return this.regDate;
    }
    public int getReadedCount(){
        return this.readedCount;
    }



}

뱅이 (620 포인트) 님이 2017년 9월 4일 질문
뱅이님이 2017년 9월 4일 수정

1개의 답변

+1 추천
 
채택된 답변

onPostExecute 에서 notifyDataSetChanged();하세요

익명사용자 님이 2017년 9월 4일 답변
뱅이님이 2017년 10월 31일 채택됨
그걸 쓰면 계속 팅겨요....
public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            if (position == 0) {
                return new HomeFragment();
            }
            else if(position == 1 ){
                return new TinfoFragment();
            }
            else if(position == 2){
                return new LabinfoFragment();
            }
            else if(position == 3){
                return new TnoteFragment();
            }
            else if(position == 4){
                return new StunoteFragment();
            }
            else if(position == 5){
                return new JobInfoFragment();
            }
            else {
                return new HelpFragment();
            }
        }


    }
  
}
이걸로 불러내는데 이 부분은 문제없는건가요??
제가 ListFragment 는 안써봐서;;
제대로 답변을 못드렸네요.
http://recipes4dev.tistory.com/63
찾아보니 이부분을 응용하신것 같은데.
asynctask는 비동기라서 데이터 파싱이 끝날때까지 기다리도록
execute.get()을 붙여보세요
아 해결됬어요 ㅠㅠ 제가 멍청했네요...String 형변환 안해서 안되는거였어요....
이거때문에 2주 고생했는데 막상하니가 기분은 좋네요 감사합니다!!
...