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

Viewpager와 fragment를 이용한 서버와의 통신

0 추천

현재 ViewPager를 이용하여 Tab에서 서버의 정보를 Json 라이브러리인 Gson을 이용하여 데이터를 가져오고 있습니다. 

 

1번째 탭과, 3번재 탭에서는 각기 다른 서블릿에 접속하여 json 형태로 데이터를 받아오는데, 처음에만 제대로 작동을 하며

 

탭을 움직이면, 1번재 탭과 3번째 탭이 정보가 반대로 출력되며 1번째 탭에서 3번째 탭으로 이동하면 정보가 출력되지 않고

 

1번째 탭에서 3번째 탭으로 이동한 다음 2번재 탭을 거쳐 다시 3번재 탭으로 움직여야지만 정보가 출력되는데 

 

이상하게도 1번째 탭의 정보가 출력됩니다. 현재 에러는 발생하지 않습니다.

 

소스는 다음과 같습니다.

 

FragmentTab1

    public static FragmentTab1 newInstance(int index){
        FragmentTab1 f1 = new FragmentTab1();
        Bundle args = new Bundle();
        args.putInt("index", index);
        f1.setArguments(args);
        return f1;
    }
    
     @Override
     public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     fragIndex = getArguments() != null ? getArguments().getInt("index") : 1;
     }

 

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

 

View qrInfoList = inflater.inflate(R.layout.fragmenttab1, container,

false);

projectId = ((MainActivity) getActivity()).projectId;

partId = ((MainActivity) getActivity()).partId;

((TextView) qrInfoList.findViewById(R.id.projectId)).setText(projectId);

((TextView) qrInfoList.findViewById(R.id.partId)).setText(partId);

 

return qrInfoList;

}

 

@Override

public void onActivityCreated(Bundle saveInstancesState) {

super.onActivityCreated(saveInstancesState);

new JSONParse().execute(projectId, partId);

}

 

private class JSONParse extends AsyncTask<String, Integer, String> {

 

String introJson;

Gson gson = new Gson();

 

@Override

protected String doInBackground(String... qrInfo) {

String jsonData = postData(qrInfo);

return jsonData;

}

 

private String postData(String[] qrInfo) {

String url = "xxx.xxx.xxx/Aservlet";

try {

HttpClient httpclient = new DefaultHttpClient();

HttpPost httpPost = new HttpPost(url);

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

nameValuePairs.add(new BasicNameValuePair("qrNum", qrInfo[0]));

nameValuePairs

.add(new BasicNameValuePair("partNum", qrInfo[1]));

httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs,

"utf-8"));

HttpResponse httpResponse = httpclient.execute(httpPost);

httpPost.setHeader("Content-type", "application/json");

HttpEntity httpEntity = httpResponse.getEntity();

InputStream is = httpEntity.getContent();

BufferedReader reader = new BufferedReader(

new InputStreamReader(is, "UTF-8"), 8);

StringBuilder sb = new StringBuilder();

String line;

while ((line = reader.readLine()) != null) {

sb.append(line + "\n");

}

introJson = sb.toString();

is.close();

reader.close();

httpclient.getConnectionManager().closeExpiredConnections();

httpclient.getConnectionManager().shutdown();

 

} catch (IOException e) {

Log.e("StringBuilding & BufferedReader",

"Error converting result " + e.toString());

}

return introJson;

}

 

@Override

protected void onPostExecute(String result) {

listView = (ListView) getActivity().findViewById(R.id.listView);

final ArrayList<HashMap<String, Object>> contactList = new ArrayList<HashMap<String, Object>>();

Type type = new TypeToken<List<JsonModel>>() {

}.getType();

List<JsonModel> tryModelList = gson.fromJson(result, type);

Collections.sort(tryModelList, new DateComparator());

for (int i = 0; i < tryModelList.size(); i++) {

HashMap<String, Object> contact = new HashMap<String, Object>();

JsonModel model = tryModelList.get(i);

contact.put("jsonOne", model.getJsonOne());

contact.put("jsonTwo", model.getJsonTwo());

contact.put("jsonThree", model.getJsonThree());

contactList.add(contact);

}

ListAdapter adapter = new SimpleAdapter(getActivity(), contactList,

R.layout.list_item, new String[] { "jsonOne", "jsonTwo",

"jsonThree" }, new int[] { R.id.jsonOne,

R.id.jsonTwo, R.id.jsonThree });

 

listView.setAdapter(adapter);

}

}

}

FragmentTab3은 FragmentTab1과 서블릿 url만 다릅니다.

 

TabPagerAdapter

public class TabPagerAdapter extends FragmentStatePagerAdapter {
    int num_TabPages = 3; 
    public TabPagerAdapter(FragmentManager fm) {
        super(fm);
        // TODO Auto-generated constructor stub
    }

    @Override
    public Fragment getItem(int i) {
        switch (i) {
        case 0:
            //Fragement for Movie Tab
            return FragmentTab1.newInstance(i);
        case 1:
           //Fragment for Music Tab
            return FragmentTab2.newInstance(i);
        case 2:
            //Fragment for video Tab
            return FragmentTab3.newInstance(i);
        }
        return null;
        
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return num_TabPages; //No of Tabs
    }
}

다른 분들의 도움을 얻어 

이 부분을 fragment 객체를 만들어서 [ return new FragmentTab1(); ] 해봤으나 제대로 작동하지 않습니다.

 

실행 동영상은 네이버까페 남궁성의 코드초보스터디에 올려놨습니다.

http://cafe.naver.com/javachobostudy/123664

도와주시면 감사하겠습니다.

익명사용자 님이 2015년 11월 5일 질문

답변 달기

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