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

프래그먼트 내에서 setAdapter의 NullPointerException

0 추천

아안녕하세요 독학하는 학생입니다.

현재 서버에서 정보를 다운로드받아 프래그먼트에(뷰페이저) 정의한 listView에 출력하려고 하는데

다른 어플에서 정상적으로 동작하던 소스를 그대로 가져와서 약간 변형했더니 저 짜증나는 널오브젝트리퍼런스뭐시기가 뜨네요..

일단 서버에서 데이터들이 다운로드되어 ArrayList에 저장되는것을 확인했습니다.

그저 리스트뷰.setAdapter(adapter)에서 널포인터익셉션이 나온다는게 문젠데

제가 어디 잘못한곳이 있나요?? 도저히 모르겠네요 프래그먼트 관련해서 처음 만져보는거라..

혹시나해서 커스텁어댑터도 함께 올립니다.

무식한 초보를 구원해주시옵소서...

 

 

public class MainActivity extends AppCompatActivity {
    int MAX_PAGE=2;
    Fragment cur_fragment = new Fragment();
    ViewPager viewpager;



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

        viewpager = (ViewPager) findViewById(R.id.viewpager);
        viewpager.setAdapter(new adapter(getSupportFragmentManager()));
    }

    private class adapter extends FragmentPagerAdapter {
   	생략...  
    }

    public static  class WaitingLayout extends android.support.v4.app.Fragment{
        변수 선언 생략...
        ListView waitingList;
        PWaitingTableDown task;
        ListViewAdapter adapter;
        ArrayList<WaitingListItem> waitingListItem = new ArrayList<>();

            @Override
            public void onCreate(Bundle savedInstanceState){
                super.onCreate(savedInstanceState);

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

                LinearLayout linearLayout = (LinearLayout) inflater.inflate(R.layout.waiting_layout,container,false);


                waitingList = (ListView) container.findViewById(R.id.waitingList);
                waitingteam = (TextView) container.findViewById(R.id.waitingteam);
                callnum = (TextView) container.findViewById(R.id.callnum);

                task = new PWaitingTableDown();
                task.execute("생략");

                return linearLayout;
            }


        public class PWaitingTableDown extends AsyncTask<String, Integer, String> {

            StringBuilder jsonHtml = new StringBuilder();

            doInBackground생략...

            protected void onPostExecute(String str) {
                생략...
                StringBuffer sb = new StringBuffer();
                try {
                    	JSONObject root = new JSONObject(str);
                   	JSONArray ja = root.getJSONArray("results");
                   	waitingListItem.clear();
                   	for (int i = 0; i < ja.length(); i++) {
                        	생략...
                    	}

                    }

                } catch (JSONException e) {
                    e.printStackTrace();
                }
                
                adapter = new ListViewAdapter(getActivity(), R.layout.item_list, waitingListItem);
                waitingList.setAdapter(adapter);

            }

        }
    }

}
public class ListViewAdapter extends BaseAdapter {
    
    private ArrayList<WaitingListItem> listViewItemList = new ArrayList<WaitingListItem>() ;
    private int mResource;
    private Context mContext;
   
    public ListViewAdapter(Context context, int layoutResource, ArrayList<WaitingListItem> listItem) {
       생략...
    }

   
    @Override
    public int getCount() {
        return listViewItemList.size() ;
    }

        @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.item_list, parent, false);
        }

        
        TextView waitingnum = (TextView) convertView.findViewById(R.id.waitingnum) ;
        TextView cinfo = (TextView) convertView.findViewById(R.id.cinfo) ;
        TextView issuingtime = (TextView) convertView.findViewById(R.id.issuingtime) ;
        Button call = (Button) convertView.findViewById(R.id.call);

	생략...
}
 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
            at com.example.kcwoo326.cutomerscareapp.MainActivity$WaitingLayout$PWaitingTableDown.onPostExecute(MainActivity.java:204)
            at com.example.kcwoo326.cutomerscareapp.MainActivity$WaitingLayout$PWaitingTableDown.onPostExecute(MainActivity.java:106)
            
원펀치맨 (2,860 포인트) 님이 2016년 7월 31일 질문

1개의 답변

+1 추천
 
채택된 답변
WaitingLayout(Fragment)에서 onCreateView의 파라미터로 제공되는 container는 생성된 뷰가 등록될 부모 뷰그룹입니다.

container에 뷰가 등록되지 않았으니 아직 참조(findByViewId)할 수 없습니다.

onCreateView에서는 생성하신 리니어 레이아웃을 바로 리턴하시고, onViewCreated에서 원하는 위젯을 꺼내보세요.

(물론 onCreateView에서 linearLayout에 바로 접근해됩니다. onCreateView 다음에 즉시 onViewCreated가 호출됩니다. 성능상의 차이점은 없습니다. 호출 시점의 모호함을 해결하기 위해 추가된 콜백입니다.)
칠리님 (10,910 포인트) 님이 2016년 8월 1일 답변
원펀치맨님이 2016년 8월 2일 채택됨
와,,고맙습니다..바로되네요 짱! 칠리님 감사합니다 꾸벅꾸벅 서버데이터 다운로드 답변도 감사드립니다. 손 놓고 있었는데ㅜㅜ 많이 배웁니다!!
으아아아 진짜 감사합니다 이거때문에 몇시간 고생했는데
덕분에 해결했어요 만세 만세 만만세!!!!!!
감사합니다~~~~~!!!!!! 해결됐어요
...