-3

In my app,I get some data from my server. They are displayed fine,but when I pass them in my Detailed Fragment,then all views are null:(.

So here is my code.

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

}

Adapter

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

}

All of my data are passed after clicking a row good. I know this as I debug the following lines.

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

and see that both String variables are not null. However,the both views(TextView,ImageView) of my detailed fragment are null.

Maybe I am doing something wrong with my xml file,and I don't see it.

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>

and finally

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>

What am I missing?

Thanks

Theo.

Theo
  • 3,099
  • 12
  • 53
  • 94
  • Please add the error log so we could identify the problem easier. – MohanadMohie Oct 21 '16 at 10:52
  • Possible duplicate of [What is a NullPointerException, and how do I fix it?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – Soham Oct 21 '16 at 11:27

2 Answers2

1

Change these

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

to

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

You'r passing data to DetailActivity. So first retrieve in DetailActivity and then pass to DetailFragment.

Also you need to pass data to DetailFragment using Bundle with setArguments(bundle)

Piyush
  • 18,895
  • 5
  • 32
  • 63
1

Your Textview articleTextView is in the fragment but you are finding it in the activitys xml:

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

insetad you should do:

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

Do the same for Imageviewl.

Isj
  • 2,020
  • 1
  • 14
  • 20