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

뷰페이저에 리스트 뷰 추가시 에러코드가뜨네요 ㅜ

0 추천
11-14 09:12:17.732 16000-16007/? E/zygote: Failed sending reply to debugger: Broken pipe
11-14 09:12:18.310 16000-16000/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.lei93.dcustella, PID: 16000
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.lei93.dcustella/com.example.lei93.dcustella.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
at com.example.lei93.dcustella.MainActivity.onCreate(MainActivity.java:43)
at android.app.Activity.performCreate(Activity.java:7000)
at android.app.Activity.performCreate(Activity.java:6991)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

제가 뷰페이저안에 리스트를 넣을려고하는데요

리스트 어뎁터 자바를 많들고 프래그먼트 자바등 필요한 코딩들 다했습니다.

코드 빨간줄없구요. 실행하면 똑같은 에러가 계속떠서 실행이 불가합니다.

어떻게 고쳐야할지 모르겠습니다. 에러를 봐서는 어뎁터쪽 문제인거같은데 어뎁터쪽 봐도 아무이상이없는데

계속 에러가 떠서 미칠꺼같네욤 ㅜㅠ 도움부탁드립니다.
어글리베어 (140 포인트) 님이 2017년 11월 14일 질문

1개의 답변

0 추천
set adaper에서 널포인트 뜨는데요

어딥터  = new adapter 후에

setadapter(어댑터) 하신게 맞나요?
익명사용자 님이 2017년 11월 14일 답변
public class MainActivity extends AppCompatActivity {


    ViewPager pager;
    LinearLayout ll;

        private ListView noticeListView;
        private NoticeListAdapter noticeAdapter;
        private List<Notice> noticeList;

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


--->여기가 어댑터 입니다. 보시는대로 setadapter(어댑터)되어있습니다.
        noticeListView = (ListView) findViewById(R.id.noticeListView);
        noticeList = new ArrayList<Notice>();
        noticeAdapter = new NoticeListAdapter(getApplicationContext(), noticeList);
        noticeListView.setAdapter(noticeAdapter);


        pager = (ViewPager) findViewById(R.id.pager);
        ll = (LinearLayout) findViewById(R.id.ll);

        TextView tab_notice = (TextView) findViewById(R.id.tab_notice);
        TextView tab_event = (TextView) findViewById(R.id.tab_event);
        TextView tab_eventreview = (TextView) findViewById(R.id.tab_eventreview);
        TextView tab_calcurator = (TextView) findViewById(R.id.tab_calcurator);

        pager.setAdapter(new PagerAdapter(getSupportFragmentManager()));
        pager.setCurrentItem(0);

        tab_notice.setOnClickListener(movePageListener);
        tab_notice.setTag(0);
        tab_event.setOnClickListener(movePageListener);
        tab_event.setTag(1);
        tab_eventreview.setOnClickListener(movePageListener);
        tab_eventreview.setTag(2);
        tab_calcurator.setOnClickListener(movePageListener);
        tab_calcurator.setTag(3);

        tab_notice.setSelected(true);

        pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                int i = 0;
                while (i < 4) {
                    if (position == i) {
                        ll.findViewWithTag(i).setSelected(true);
                    } else {
                        ll.findViewWithTag(i).setSelected(false);
                    }
                    i++;
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }

        });


       new BackgroundTask().execute();
    }


    View.OnClickListener movePageListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int tag = (int) v.getTag();

            int i = 0;
            while (i < 4) {
                if (tag == i) {
                    ll.findViewWithTag(i).setSelected(true);
                } else {
                    ll.findViewWithTag(i).setSelected(false);
                }
                i++;
            }

            pager.setCurrentItem(tag);

        }
    };






    class BackgroundTask extends AsyncTask<Void, Void, String>
    {
        String target;
        @Override
        protected void onPreExecute(){
            target="(제db링크입니다)";
        }

        @Override
        protected String doInBackground(Void... voids) {
            try{
                URL url =new URL(target);
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                InputStream inputStream = httpURLConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                String temp;
                StringBuilder stringBuilder = new StringBuilder();
                while((temp = bufferedReader.readLine()) != null)
                {
                    stringBuilder.append(temp + "\n");
                }
                bufferedReader.close();
                inputStream.close();
                httpURLConnection.disconnect();
                return stringBuilder.toString().trim();

            }catch (Exception e){
                e.printStackTrace();
            }
            return null;
        }
        @Override
        public void onProgressUpdate(Void... values){
                super.onProgressUpdate();
        }

        @Override
        public void onPostExecute(String result){
            try{
                JSONObject jsonObject = new JSONObject(result);
                JSONArray jsonArray = jsonObject.getJSONArray("response");
                int count = 0;
                String noticeContent, noticeName, noticeDate;
                while (count < jsonArray.length())
                {
                    JSONObject object = jsonArray.getJSONObject(count);
                    noticeContent = object.getString("noticeContent");
                    noticeName = object.getString("noticeName");
                    noticeDate =  object.getString("noticeDate");
                    Notice notice = new Notice(noticeContent, noticeName, noticeDate);
                    noticeList.add(notice);
                            count++;
                }
            } catch (Exception e){
                e.printStackTrace();
            }
        }
    }
현재 제 메인액티비티 코드입니다. 답변해주신 어댑터 부분에 똑같이 되있습니다. ㅠㅜ
이건 NoticeListAdapter 코드 부분입니다.
public class NoticeListAdapter extends BaseAdapter {
    private Context context;
    private List<Notice>  noticeList;

    public NoticeListAdapter(Context context, List<Notice> noticeList) {
        this.context = context;
        this.noticeList = noticeList;
    }

    @Override
    public int getCount() {

        return noticeList.size();
    }

    @Override
    public Object getItem(int position) {

        return noticeList.get(position);
    }

    @Override
    public long getItemId(int position) {

        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup ViewGroup) {
        View v = View.inflate(context, R.layout.notice,null);
        TextView noticeText = (TextView) v.findViewById(R.id.noticeText);
        TextView nameText = (TextView) v.findViewById(R.id.nameText);
        TextView dateText  = (TextView) v.findViewById(R.id.dateText);

        noticeText.setText(noticeList.get(position).getNotice());
        nameText.setText(noticeList.get(position).getName());
        dateText.setText(noticeList.get(position).getDate());

        v.setTag(noticeList.get(position).getNotice());
        return v;
    }

}
noticeListView = (ListView) findViewById(R.id.noticeListView);<<<
이부분이 noticeListView 객체가 null일거 같은데요

ViewPager의 화면이 생성이 되지도 않았는데 ViewPager의 일부 화면인 ListView의 객체를 어떻게 가져올 수 있을까요?

ViewPager의 동작원리부터 먼저 확인 하시는게 좋을거 같습니다.

noticeListView = (ListView) findViewById(R.id.noticeListView);코드는
PagerAdapter 내부에서 처리 해야 될거 같네요
제가 전체코드를 올린게 아니라 부분코드만 올린거라 헷갈릴수도있으시겠네요. 뷰페이저 화면들도 다구성된상태에서 그 페이지안에들어갈 리스트가 에러가나는거에요 ㅜ
AppCompatActivity 의 onCreate에서 noticeListView = (ListView) findViewById(R.id.noticeListView);를 하고 있습니다.

ViewPager화면들은
pager.setAdapter(new PagerAdapter(getSupportFragmentManager()));
이후 pageradapter의 instantiateItem메서드가 호출되고 아이템들이 생성되면 각 화면들이 생성됩니다.

각 화면들은 생성되고 노출되는 시점들이 있는데 생성도 되지 않았는데 객체를 가져와서 사용하려고 하니깐 문제인겁니다.


pager.setAdapter(new PagerAdapter(getSupportFragmentManager()));
이후로  noticeListView = (ListView) findViewById(R.id.noticeListView);
부분을 넣어서 순서를 바꿔처리 하실려고 하시면 안됩니다.

noticeListView = (ListView) findViewById(R.id.noticeListView); <<이 부분 자체가
MainActivity의 onCreate부분에 있으면 안됩니다.
아... 이해했습니다. 맘편하게 리스트만 새로 코딩하는게 편하겠네요. 도움주셔서 감사합니다. 겉핥기로 독학하다보니 문제점이 생겨도 왜그런지 몰랐느데 이렇게 또 하나 배우네요 감사합니다 ^^
...