0

"전체 조각"개념이 처음이므로 도움이 필요합니다.조각 모음의 사용자 정의 목록 뷰 - null 포인터 예외

코드에서 사용자 정의 listview를 사용하고 싶습니다. 내 코드가 Activity에서 제대로 작동하지만 조각을 구현하는 데에는 큰 어려움이 있습니다. 나는 2 개의 널 예외를 얻고 있고 나는 어디에서인지 알아낼 수 없다.

또한 매우 기본적인 질문이 있습니다. 어떤 단편, 단편 활동 또는 단편 자체에서 사용해야합니까?

여기 내 조각 코드

public class NewsFeed extends Fragment { 

List<NewsFeedList> fr_ne_list = new ArrayList<NewsFeedList>(); 
Context ctx; 
ListView list; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.activity_news_feed, container, false); 
    list=(ListView)v.findViewById(R.id.listViewNewsFeedFriend); 
    return v; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if(isAdded()) { 
     ctx=getActivity(); 
     napolniseznamFriendList(); 
     /*"at com.osembitdesign.faceit.NewsFeed.onCreate(NewsFeed.java:49)"*/ 
     fillNewsFeedListView(fr_ne_list); 
    } 

} 

//filling custom listview 
private void fillNewsFeedListView(List<NewsFeedList> elem) { 
    // TODO Auto-generated method stub 
    ArrayAdapter<NewsFeedList> adapter = new MyListAdapter(ctx,R.layout.news_feed_list_item, elem); 

    /*"at com.osembitdesign.faceit.NewsFeed.fillNewsFeedListView(NewsFeed.java:58)"*/ 
    list.setAdapter(adapter); 

} 


private class MyListAdapter extends ArrayAdapter<NewsFeedList> { 
    public MyListAdapter(Context context, int textViewResourceId) { 
     super(context, textViewResourceId); 
     // TODO Auto-generated constructor stub 
    } 

    private List<NewsFeedList> element; 

    public MyListAdapter(Context context, int resource, List<NewsFeedList> items) { 
     super(context, resource, items); 
     this.element = items; 

    } 

    @Override 
    public View getView... 
} 
//adding items to my (Array)List 

private void napolniseznamFriendList() { 
    // TODO Auto-generated method stub 
    fr_ne_list.add(new NewsFeedList("xxxx", "xxxx","xxxx",R.drawable.ic_action_search)); 
    fr_ne_list.add(new NewsFeedList("xxx", "xx","xxx",R.drawable.ic_action_search)); 
} 

}

03-13 21:26:21.512 24416-24416/ E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.NullPointerException 
      at com.NewsFeed.fillNewsFeedListView(NewsFeed.java:58) 
      at com.NewsFeed.onCreate(NewsFeed.java:49) 

답변

0

검토 Fragment lifecycle

오류입니다. onCreate()은 항상 onCreateView() 전에 호출됩니다.

즉 이 onCreate()에서 호출 될 때 list은 항상 null입니다.

대신 onCreate()에서 onViewCreated()으로 조건문을 이동하십시오. 직접 onCreateView()으로 이동할 수는 있지만 관계없는 로직을 분리하지 않는 것이 좋습니다.

또한 매우 기본적인 질문이 있습니다. 조각, 조각 활동 또는 조각 자체에서 어떤 문맥을 사용해야합니까?

Fragments는 Context입니다. getActivity()을 사용하십시오. 이유가 있습니다.

+0

고마워요! 당신이 말했듯이 나는 onViewCreated()로 조건문을 옮겼다. 그것은 매력처럼 작동했다! – gregaj

+0

당신을 진심으로 환영합니다! –

+0

여기에서 도와 줄 수 있습니다. http://stackoverflow.com/questions/41938475/empty-custom-listview-in-fragment-on-back-tab – Panache

0

Heres 내 앱 중 하나에서 사용하는 코드입니다. 원하는 경우 목록 뷰로 대체 할 수있는 격자보기를 사용합니다. 여전히 일할 것이다!

조각 :

public class GalleryScreenFragment extends MyFragment{ 

private GalleryScreenGridAdapter mAdapter; 
private GridView mGridView; 
private boolean mActionMode = false; 
private ImageButton mHomeButton,mBackButton,mDeleteButton, mShareButton; 
private Animation mFadeInAnimation; 
private Context mContext; 
private OnGalleryItemSelectedListener mListener = mTempListener; 

public GalleryScreenFragment(){ 
    if(null == Data.imagePathList) 
     FileIO.readImageTasks(); 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    if (activity instanceof OnGalleryItemSelectedListener) { 
     mListener = (OnGalleryItemSelectedListener) activity; 
     mContext = activity; 
    } 
    else{ 
     throw new ClassCastException(activity.toString() 
      + " must implemenet GalleryScreenFragment.OnGalleryItemSelectedListener"); 
    } 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
    mListener = mTempListener; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    RelativeLayout relativeLayout = (RelativeLayout) inflater.inflate(R.layout.activity_gallery_screen_main, null); 
    mGridView = (GridView) relativeLayout.findViewById(R.id.gridview); 
    mGridView.setEmptyView(relativeLayout.findViewById(R.id.emptyGridView)); 

    mHomeButton = (ImageButton) relativeLayout.findViewById(R.id.homeButton); 
    mHomeButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      mListener.onGalleryHomeButtonPressed(); 
     } 
    }); 

    mShareButton = (ImageButton) relativeLayout.findViewById(R.id.shareButton); 
    mShareButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

     } 
    }); 

    mBackButton = (ImageButton) relativeLayout.findViewById(R.id.backButton); 
    mBackButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

     } 
    }); 

    mDeleteButton = (ImageButton) relativeLayout.findViewById(R.id.deleteButton); 
    mDeleteButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

     } 
    }); 

    mAdapter = new GalleryScreenGridAdapter(mContext); 
    mGridView.setAdapter(mAdapter); 

    mGridView.setVerticalScrollBarEnabled(false); 

    mGridView.setOnScrollListener(new PauseOnScrollListener(ImageLoader.getInstance(), true, false)); 

    mFadeInAnimation = AnimationUtils.loadAnimation(mContext, R.anim.fade_in); 

    return relativeLayout; 
} 
} 

활동 :

public class GalleryScreenActivity extends MyFragmentActivity implements OnGalleryItemSelectedListener{ 

private boolean mSelectionMode = false; 
private GalleryScreenFragment mGalleryScreenFragment; 

@Override 
public void onCreate(Bundle bundle) { 
    super.onCreate(bundle); 
    setContentView(R.layout.activity_gallery_screen_content_frame); 

    mGalleryScreenFragment = (GalleryScreenFragment) getSupportFragmentManager().findFragmentById(R.id.mainFragment); 
} 
} 

어댑터 :

public class GalleryScreenGridAdapter extends BaseAdapter implements BitmapProcessor{ 
private LayoutInflater inflater; 
private Context mContext; 
private DisplayImageOptions mOptions; 
private ImageLoader mImageLoader = ImageLoader.getInstance(); 

public GalleryScreenGridAdapter(Context context){ 
    mContext = context; 
    inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    mOptions = new DisplayImageOptions.Builder() 
    .imageScaleType(ImageScaleType.EXACTLY) 
    .bitmapConfig(Bitmap.Config.RGB_565) 
    .preProcessor(this) 
    .cacheInMemory(true) 
    .resetViewBeforeLoading(true) 
    .build(); 
} 

@Override 
public int getCount() { 
    return (null == Data.imagePathList) ? 0 : Data.imagePathList.size(); 
} 

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

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

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    final GridObject object = Data.imagePathList.get(position); 

    final GalleryScreenGridItem view = (GalleryScreenGridItem) inflater.inflate(R.layout.activity_gallery_screen_grid_item_layout, null); 

    final ImageView imageView = (ImageView) view.findViewById(R.id.image); 

    imageView.setImageBitmap(null); 
    view.setChecked(false); 

    mImageLoader.loadImage(object.getUrl(), new ImageSize(200, 200), mOptions, new SimpleImageLoadingListener(){ 

     @Override 
     public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 
      imageView.setImageResource(android.R.drawable.ic_delete); 
     } 

     @Override 
     public void onLoadingComplete(String imageUri, View tempView, Bitmap loadedImage) { 
      view.setChecked(object.getState()); 
      imageView.setImageBitmap(loadedImage); 
      AlphaAnimation fadeImage = new AlphaAnimation(0, 1); 
      fadeImage.setDuration(100); 
      fadeImage.setInterpolator(new DecelerateInterpolator()); 
      imageView.startAnimation(fadeImage); 
     } 
    }, Data.imagePathList.get(position).getPictureType()); 
    return view; 
} 
} 

당신이 더 이상 도움이 필요하면 알려 않습니다. 활동 내에서 조각을 사용합니다. 조각에는 어댑터에서 채워지는 gridview가 있습니다. gridview를 listview로 바꾸고 어댑터의 getview를 자신의 코드로 바꾸면됩니다.

+0

빠른 응답과 코드 예제를 이용해 주셔서 감사합니다. 나는 누군가 그것을 사용할 것이라고 확신한다. – gregaj