我的观点给了我一个空指针异常

时间:2016-10-21 10:49:39

标签: android nullpointerexception

在我的应用中,我从服务器获取了一些数据。它们显示正常,但是当我在详细片段中传递它们时,所有视图都为空:(。

所以这是我的代码。

  public class MainActivityFragment extends Fragment {
  public static final String TAG = "AelApp";
  public static ArrayList<MyModel> listItemsList;
  RecyclerView myList;
  public static MatchReportsAdapter adapter;

public MainActivityFragment() {
    // Required empty public constructor
}

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

    updateMatchReport();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    getActivity().setTitle("Match Report");

    View rootView = inflater.inflate(R.layout.fragment_main_activity, container, false);
    listItemsList = new ArrayList<>();

    myList = (RecyclerView)rootView.findViewById(R.id.listview_match_reports);
    final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
    myList.setHasFixedSize(true);
    myList.setLayoutManager(linearLayoutManager);
    adapter = new MatchReportsAdapter(getActivity(), listItemsList);
    myList.setAdapter(adapter);

    return rootView;
}

public void updateMatchReport(){
    Intent i = new Intent(getActivity(), MatchReport.class);
    getActivity().startService(i);
}

}

适配器

public class MatchReportsAdapter extends   
RecyclerView.Adapter<MatchReportsAdapter.RowHolder>{
private List<MyModel> reportsList;
private Context mContext;
private ImageLoader mImageLoader;
private int focused = 0;

public MatchReportsAdapter(Activity activity, List<MyModel> reportsLists){
    this.reportsList = reportsLists;
    this.mContext=activity;
}

@Override
public RowHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_items,null);

    final RowHolder holder = new RowHolder(v);
    return holder;
}

@Override
public void onBindViewHolder(RowHolder holder, int position) {
    final MyModel listItems = reportsList.get(position);
    holder.itemView.setSelected(focused==position);

    holder.getLayoutPosition();

    mImageLoader = AppController.getInstance().getImageLoader();

    holder.thumbnail.setImageUrl(listItems.getImage(),mImageLoader);
    holder.thumbnail.setDefaultImageResId(R.drawable.reddit_placeholder);

    holder.name.setText(Html.fromHtml(listItems.getTitle()));

    holder.relativeLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String article = listItems.getArticle();
            String image = listItems.getImage();
            Intent i = new Intent(mContext, DetailedActivity.class);

            i.putExtra("articleKey",article);
            i.putExtra("imageKey",image);
            mContext.startActivity(i);
        }
    });
}

@Override
public int getItemCount() {
    return reportsList.size();
}

public class RowHolder extends RecyclerView.ViewHolder{
    protected NetworkImageView thumbnail;
    protected TextView name;

    protected RelativeLayout relativeLayout;
    public RowHolder(View itemView) {
        super(itemView);

        this.relativeLayout = (RelativeLayout)      
  itemView.findViewById(R.id.recLayout);
        this.thumbnail =   
  (NetworkImageView)itemView.findViewById(R.id.thumbnail);
        this.name = (TextView)itemView.findViewById(R.id.title);

    }

   }
}

DetailedActivity

public class DetailedActivity extends AppCompatActivity {

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

    if(savedInstanceState == null){
        getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.detailed_match_reports,new DetailedActivityFragment())
                .commit();
    }
   }
}

DetailedActivityFragment

public class DetailedActivityFragment extends Fragment {
TextView articleTextView;
String image;
String article;
ImageView imageView;

public DetailedActivityFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v = inflater.inflate(R.layout.fragment_detailed_activity, container, false);

    articleTextView = (TextView)getActivity().findViewById(R.id.articleTextView);

    imageView = (ImageView)getActivity().findViewById(R.id.imageNews);

    Intent i = getActivity().getIntent();

    article = i.getStringExtra("articleKey");
    image = i.getStringExtra("imageKey");

    Picasso.with(getActivity()).load(image).into(imageView);

    articleTextView.setText(article);


    return v;
 }

}

点击一行后,我的所有数据都会被传递。我知道这一点,因为我调试了以下几行。

    article = i.getStringExtra("articleKey");
    image = i.getStringExtra("imageKey");

并看到两个String变量都不为null。但是,我的详细片段的两个视图(TextView,ImageView)都是null。

也许我的xml文件出错了,我也看不到它。

activity_main.xml中

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:id="@+id/match_reports"
tools:context="theo.testing.androidservices.fragments.MainActivityFragment">

</FrameLayout>

fragment_main_activity

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recLayout"
tools:context=".activities.MainActivity"
android:background="#fff">

<android.support.v7.widget.RecyclerView

    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/listview_match_reports"
    android:layout_alignParentStart="true"
    android:layout_alignParentLeft="true"
    />

 </RelativeLayout>

activity_detailed.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/detailed_match_reports"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="theo.testing.androidservices.activities.DetailedActivity"
tools:ignore="MergeRootFrame">
</FrameLayout>

最后

fragment_detailed_activity

<?xml version="1.0" encoding="utf-8"?>

    

<ScrollView android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/imageNews"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView
        android:layout_gravity="center_horizontal"
        android:padding="10dp"
        android:text="xcvxcvxcv"
        android:textColor="#000"
        android:layout_marginTop="5dp"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/articleTextView"/>
</ScrollView>

我错过了什么?

由于

西奥。

2 个答案:

答案 0 :(得分:1)

更改这些

articleTextView = (TextView)getActivity().findViewById(R.id.articleTextView);
imageView = (ImageView)getActivity().findViewById(R.id.imageNews);

articleTextView = (TextView)v.findViewById(R.id.articleTextView);
imageView = (ImageView)v.findViewById(R.id.imageNews);

您将数据传递给DetailActivity。首先在DetailActivity中检索,然后转到DetailFragment

您还需要使用DetailFragment Bundle将数据传递给setArguments(bundle)

答案 1 :(得分:1)

您的Textview文章文本视图位于片段中,但您在活动xml中找到它:

articleTextView = (TextView)getActivity().findViewById(R.id.articleTextView);

insetad你应该这样做:

articleTextView = (TextView)(v.findViewById(R.id.articleTextView));

为Imageviewl做同样的事。