2017-12-12 3 views
1

최근에 안드로이드 프로그래밍에 대해 배웁니다. 자, 내 안드로이드 애플 리케이션 json과 PHP에서 데이터를 가져오고 싶어요. 나는 그것을 실행할 때 다음 URL에서 json 파일을 조각 내부의 목록보기로 표시

fragment_bamanual.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ListView 
     android:id="@+id/listView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" > 
    </ListView> 


</FrameLayout> 
그래서

내 조각 내 응용 프로그램

package com.example.boby.firstapp; 

import android.os.AsyncTask; 
import android.support.v4.app.Fragment; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.HashMap; 


public class Bamanual extends Fragment { 
    ListView listView; 
    ArrayList<HashMap<String, String>> list_data; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment_bamanual, container, false); 

    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     getActivity().setTitle("Menu Ba Manual"); 
     getJSON("http://192.168.3.223:84/fppb/andro_login/fppb"); 
    } 

    private void loadIntoListView(String json) throws JSONException { 
     ArrayList<String> items = new ArrayList<String>(); 

     JSONArray jsonArray = new JSONArray(json); 
     String[] ba = new String[jsonArray.length()]; 
     for (int i = 0; i < jsonArray.length(); i++) { 
      JSONObject obj = jsonArray.getJSONObject(i); 
      String name=obj.getString("ItemCode"); 
      String photo=obj.getString("PhotoName"); 
      items.add(name); 
     } 
     ArrayAdapter<String> mArrayAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_expandable_list_item_1, items); 
     listView = (ListView) listView.findViewById(R.id.listView1); 
     listView.setAdapter(mArrayAdapter); 
     //Toast.makeText(getActivity(), jsonArray.toString(), Toast.LENGTH_LONG).show(); 
    } 

    private void getJSON(final String urlWebService) { 

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

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

      @Override 
      protected void onPostExecute(String s) { 
       super.onPostExecute(s); 
       try { 
        loadIntoListView(s); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
      @Override 
      protected String doInBackground(Void... voids) { 

       try { 
        URL url = new URL(urlWebService); 
        HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
        StringBuilder sb = new StringBuilder(); 
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream())); 

        String json; 

        while ((json = bufferedReader.readLine()) != null) { 
         sb.append(json + "\n"); 
        } 

        return sb.toString().trim(); 
       } catch (Exception e) { 
        return null; 
       } 

      } 
     } 

     GetJSON getJSON = new GetJSON(); 
     getJSON.execute(); 
    } 
} 

Bamanual.java 내 스크립트

이며, 여기에 강제로 닫습니다. 어떻게 해결할 수 있습니까? 내가 뭐 놓친 거 없니 ?

미리 감사드립니다. 나쁜 영어로 죄송합니다.

나는 내 logcat에서 이것을 얻습니다.

12-12 09:59:21.382 14806-15139/com.example.boby.firstapp E/StudioProfiler: JVMTI error: 15(JVMTI_ERROR_THREAD_NOT_ALIVE) 
12-12 09:59:21.388 14806-15139/com.example.boby.firstapp E/StudioProfiler: JVMTI error: 15(JVMTI_ERROR_THREAD_NOT_ALIVE) 
12-12 09:59:30.235 14806-14806/com.example.boby.firstapp E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.example.boby.firstapp, PID: 14806 
                      java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.widget.ListView.findViewById(int)' on a null object reference 
                       at com.example.boby.firstapp.Bamanual.loadIntoListView(Bamanual.java:55) 
                       at com.example.boby.firstapp.Bamanual.access$000(Bamanual.java:25) 
                       at com.example.boby.firstapp.Bamanual$1GetJSON.onPostExecute(Bamanual.java:73) 
                       at com.example.boby.firstapp.Bamanual$1GetJSON.onPostExecute(Bamanual.java:62) 
                       at android.os.AsyncTask.finish(AsyncTask.java:695) 
                       at android.os.AsyncTask.-wrap1(Unknown Source:0) 
                       at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:712) 
                       at android.os.Handler.dispatchMessage(Handler.java:105) 
                       at android.os.Looper.loop(Looper.java:164) 
                       at android.app.ActivityThread.main(ActivityThread.java:6541) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 
+0

이 너무 귀하의 로그 캣을 보여하시기 바랍니다 달성 할 수있는 방법을 모두 보내려고합니다. – kimkevin

+0

@kimkevin 내 업데이트 된 게시물을 확인하십시오. – YVS1102

+0

내 추측이 맞습니다. 내 대답을 확인하십시오. – kimkevin

답변

3

오류 메시지 없이는 확실하지 않지만 뷰 바인딩이 이상하다고 생각합니다. 아래 코드를 확인하십시오. listViewrootView에서 찾을 수 있기 때문에 listView이 null 일 수 있습니다.

public class Bamanual extends Fragment { 
    ListView listView; 
    ArrayList<HashMap<String, String>> list_data; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_bamanual, container, false); 
     listView = (ListView) rootView.findViewById(R.id.listView1); 
     return rootView; 
    } 

이 부분 문자열 이름 = obj.getString ("ItemCode")을 선택하면, String photo = obj.getString ("PhotoName"); items.add (name); . 난 내가

public class Bamanual extends Fragment { 
    ListView listView; 
    ArrayList<Photo> list_data; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_bamanual, container, false); 
     listView = (ListView) rootView.findViewById(R.id.listView1); 
     return rootView; 

    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     getActivity().setTitle("Menu Ba Manual"); 
     getJSON("http://192.168.3.223:84/fppb/andro_login/fppb"); 
    } 

    private void loadIntoListView(String json) throws JSONException { 
     List<Photo> items = new ArrayList<Photo>(); 

     JSONArray jsonArray = new JSONArray(json); 
     String[] ba = new String[jsonArray.length()]; 
     for (int i = 0; i < jsonArray.length(); i++) { 
      JSONObject obj = jsonArray.getJSONObject(i); 
      String code=obj.getString("ItemCode"); 
      String name=obj.getString("PhotoName"); 
      items.add(new Photo(code, name); 
     } 
     ArrayAdapter<Photo> mArrayAdapter = new ArrayAdapter<Photo>(getActivity(),android.R.layout.simple_expandable_list_item_1, items); 
     listView.setAdapter(mArrayAdapter); 
     //Toast.makeText(getActivity(), jsonArray.toString(), Toast.LENGTH_LONG).show(); 
    } 

사진

public class Photo { 
    String code; 
    String name; 

    public Photo(String code, String name) { 
     this.code = code; 
     this.name = name; 
    } 

    public String getCode() { 
     return code; 
    } 

    public String getName() { 
     return name; 
    } 
} 
+0

정말 고마워요. 그것은 내 문제를 해결합니다. 이 부분을 체크하면'String name = obj.getString ("ItemCode"); String photo = obj.getString ("PhotoName"); items.add (name);'. 나는 둘 다 보내고 싶습니다, 어떻게 성취 할 수 있습니까? – YVS1102

+0

@ YVS1102 String 코드와 String 이름을 가진 모델 객체'SomethingPhoto'를 생성하고 List 만 사용할 수 있습니다. – kimkevin

+0

나는 google을 사용할 것이라고 생각한다. 감사합니다 – YVS1102

관련 문제