0

사용자 정의 BaseAdapter로 목록을 만들려고합니다. nullpointerexception 오류가 발생합니다. 어댑터에 데이터를 제대로로드 할 수 없거나보기가 잘못되었습니다. 다음은 BaseAdapter를 사용하여 ListFragment에 문제가 발생했습니다.

내 코드입니다 :
FragmentActivity

public class NewsItemListActivity extends FragmentActivity implements NewsItemListFragment.Callbacks { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_newsitem_list);   
     if (savedInstanceState != null) { 
      mActivePosition = savedInstanceState.getInt(STATE_ACTIVE_POSITION); 
     } 
     if (findViewById(R.id.newsitem_detail_container) != null) { 
      listfragment = ((NewsItemListFragment) getSupportFragmentManager() 
        .findFragmentById(R.id.newsitem_list)); 
      listfragment.setActivateOnItemClick(true);  
     } 
} 

Activity_newsitem_list 레이아웃

<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/newsitem_list" 
    android:name="com.example.app.NewsItemListFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginLeft="16dp" 
    android:layout_marginRight="16dp" 
    tools:context=".NewsItemListActivity" 
    tools:layout="@android:layout/list_content" /> 


ListFragment

public class NewsItemListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<List<NewsData>>{ 

    List<NewsData> listdata; 
    CustomAdapter mListAdapter; 

    public NewsItemListFragment() { 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     // Initially there is no data 
     setEmptyText("No Data Here"); 

     mListAdapter = new CustomAdapter(getActivity(),listdata); 
     setListAdapter(mListAdapter); 

     // Start out with a progress indicator. 
     setListShown(false); 

     getLoaderManager().initLoader(0, null, this); 
    } 

    @Override 
    public Loader<List<NewsData>> onCreateLoader(int arg0, Bundle arg1) { 
     return new ListLoader(getActivity()); 
    } 
    @Override 
    public void onLoadFinished(Loader<List<NewsData>> arg0, 
      List<NewsData> data) { 
      listdata = data; 
     mListAdapter.notifyDataSetChanged(); 
     if (isResumed()) { 
      setListShown(true); 
     } else { 
      setListShownNoAnimation(true); 
     }  
    } 
    @Override 
    public void onLoaderReset(Loader<List<NewsData>> arg0) { 
     listdata = null; 
    } 

} 

BaseAdapter

public class CustomAdapter extends BaseAdapter{ 

    private List<NewsData> list; 
    Context context; 
    public CustomAdapter(Context c,List<NewsData> data){ 
     context = c; 
     list = data;  
    } 
    @Override 
    public int getCount() { 
     return list.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return list.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view; 

     if (convertView == null) { 
      LayoutInflater mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = mInflater.inflate(R.layout.list_layout, parent, false); 
     } else { 
      view = convertView; 
     } 

     NewsData item = list.get(position); 
     ((TextView)view.findViewById(R.id.subject)).setText(item.getSubject()); 
     ((TextView)view.findViewById(R.id.cdate)).setText(item.getCDate()); 

     return view; 
    } 

} 

NewsData 클래스

public class NewsData { 
    public String id; 
    public String subject; 
    public String cdate; 

     public NewsData(String id, String subject,String cdate) { 
      this.id = id; 
      this.subject = subject; 
      this.cdate = cdate; 
     } 
     public String getId() { 
      return id; 
     } 
     public void setId(String id) { 
      this.id = id; 
     } 
     public String getSubject() { 
      return subject; 
     } 
     public void setSubject(String subject) { 
      this.subject = subject; 
     } 
     ........ 
} 

ADD 로더 ... 긴 게시물에 대한

@Override 
    public List<NewsData> loadInBackground() { 
     List<NewsData> entries = null; 
      ..... 
      return entries.add(new NewsData(i,subject,cdate)); 
} 

@Override 
    public void deliverResult(List<NewsData> listOfData) { 
     List<NewsData> oldNews = listOfData; 
     mNewsData = listOfData; 

     if (isStarted()) { 
      // If the Loader is currently started, we can immediately 
      // deliver its results. 
      super.deliverResult(listOfData); 
     } 
    } 

오류 로그

04-05 07:31:17.951: E/AndroidRuntime(1495): FATAL EXCEPTION: main 
04-05 07:31:17.951: E/AndroidRuntime(1495): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.appapp/com.example.appapp.NewsItemListActivity}: java.lang.NullPointerException 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at android.app.ActivityThread.access$600(ActivityThread.java:130) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at android.os.Looper.loop(Looper.java:137) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at java.lang.reflect.Method.invoke(Method.java:511) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at dalvik.system.NativeStart.main(Native Method) 
04-05 07:31:17.951: E/AndroidRuntime(1495): Caused by: java.lang.NullPointerException 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at com.example.appapp.CustomAdapter.getCount(CustomAdapter.java:25) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at android.widget.ListView.setAdapter(ListView.java:460) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at android.support.v4.app.ListFragment.setListAdapter(ListFragment.java:182) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at com.example.appapp.NewsItemListFragment.onActivityCreated(NewsItemListFragment.java:96) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1468) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1070) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1861) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:547) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1163) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at android.app.Activity.performStart(Activity.java:5018) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2032) 
04-05 07:31:17.951: E/AndroidRuntime(1495):  ... 11 more 

죄송합니다

+0

에서 일부 항목? –

+0

'public int getCount() { \t \t return list.size(); // line25 \t} – Eric

+0

이 줄을 실행하려고하면 null에있는 목록처럼 보입니다. –

답변

0

는 매우 간단 실제로,

난 당신이 초기화되지 볼 수 있습니다 당신은 NullPointerException을 얻는 이유 List<NewsData> listdata
.

사용하기 전에 해당 목록의 새 인스턴스를 만들어야합니다.

당신의 OnCreate()

쓰기 listdata = new List<NewsData>() 및 추가 사용자 정의 어댑터의 라인 (25)에 기록 된 그 무엇 List

+0

리스트가 현재 보여줄 수있는'onCreate()'에 아이템을 추가했지만, 로더로부터 데이터를로드 할 수 없으며,'onCreate()'에서 작성한 데이터 만 보여줍니다. 올바른 데이터를로드하려면 어떻게해야합니까 ?? – Eric

+0

로더에서 데이터를 가져 오기 위해 BaseAdapter 내부에 메서드를 추가했습니다. 어쨌든 고맙습니다 ~~ – Eric

관련 문제