片段中的自定义ListView -NULL指针异常



我是"整个片段"概念的新手,我需要一些帮助。

我想在片段中使用自定义listView,我的代码在活动中工作正常,但是片段中的实现很痛苦。我得到了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)

查看片段生命周期。onCreate()总是在onCreateView()之前调用。

这意味着当fillNewsFeedListView()onCreate()调用时,list将始终为null。

而是将条件语句从onCreate()移至onViewCreated()。您可以将其直接移动到onCreateView(),但最好将无关的逻辑分开。

我也有非常基本的问题,我应该在 片段,来自碎片活动或片段本身?

Fragment s不是 Context s。使用getActivity(),它是有原因的。

我在一个应用程序中使用了一些代码。它使用网格视图,如果需要,您可以用listView替换。仍然可以工作!

片段:

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;
}
}

请让我知道您是否需要更多帮助。它在活动中使用碎片。该片段具有一个由适配器填充的网格景观。只需用listView替换gridview和适配器的getView用自己的代码,就可以使用。

最新更新