0

I am trying to add custom listview to a class which extends fragment. But it is giving error at 4 places. Here is the code:

TopStoriesFragment.java

public class TopStoriesFragment extends Fragment {

    public String thehindu = "http://www.thehindu.com/news/?service=rss";
    public String toi = "http://timesofindia.feedsportal.com/c/33039/f/533965/index.rss";
    public String reuters = "http://feeds.reuters.com/reuters/topNews";
    public String deccanherald = "http://www.deccanherald.com/rss-internal/top-stories.rss";
    public String currenturl = thehindu;
    AlertDialog levelDialog;
    public String fakingnews = "http://thepuntended.wordpress.com/";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_top_rated, container, false);

        feedTitle = (TextView) rootView.findViewById(R.id.feedtitle);
        feedDescribtion = (TextView) rootView.findViewById(R.id.feeddescribtion);

        startReadRss();

        return rootView;
    }

    public class RssLoadingTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            displayRss();
        }

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            preReadRss();
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            // TODO Auto-generated method stub
            // super.onProgressUpdate(values);
        }

        @Override
        protected Void doInBackground(Void... arg0) {
            // TODO Auto-generated method stub
            readRss();
            return null;
        }

    }

    private RSSFeed myRssFeed = null;

    TextView feedTitle;
    TextView feedDescribtion;

    // TextView feedPubdate;
    // TextView feedLink;

    public class MyCustomAdapter extends ArrayAdapter<RSSItem> {

        public MyCustomAdapter(Context context, int textViewResourceId,
                List<RSSItem> list) {
            super(context, textViewResourceId, list);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            // return super.getView(position, convertView, parent);

            View row = convertView;
            if (row == null) {

    //------------------------------- Error 1-------------------------------
                LayoutInflater inflater = getLayoutInflater();
    //------------------------------- Error 1-------------------------------

                row = inflater.inflate(R.layout.row, parent, false);
            }

            TextView listTitle = (TextView) row.findViewById(R.id.listtitle);
            listTitle.setText(myRssFeed.getList().get(position).getTitle());
            TextView listPubdate = (TextView) row
                    .findViewById(R.id.listpubdate);
            listPubdate.setText(myRssFeed.getList().get(position).getPubdate());

            if (position % 2 == 0) {
                listTitle.setBackgroundColor(0xff101010);
                listPubdate.setBackgroundColor(0xff101010);
            } else {
                listTitle.setBackgroundColor(0xff080808);
                listPubdate.setBackgroundColor(0xff080808);
            }

            return row;
        }
    }

    private void startReadRss() {
        new RssLoadingTask().execute();
    }

    private void preReadRss() {
        feedTitle.setText("--- wait ---");
        feedDescribtion.setText("");
        // feedPubdate.setText("");
        // feedLink.setText("");

    //------------------------------- Error 2 (Solved)-------------------------------
        setListAdapter(null);
    //------------------------------- Error 2-------------------------------

        Toast.makeText(getActivity(), "Reading RSS, Please wait.", Toast.LENGTH_LONG)
                .show();
    }

    private void readRss() {

        try {
            URL rssUrl = new URL(currenturl);
            SAXParserFactory mySAXParserFactory = SAXParserFactory
                    .newInstance();
            SAXParser mySAXParser = mySAXParserFactory.newSAXParser();
            XMLReader myXMLReader = mySAXParser.getXMLReader();
            RSSHandler myRSSHandler = new RSSHandler();
            myXMLReader.setContentHandler(myRSSHandler);
            InputSource myInputSource = new InputSource(rssUrl.openStream());
            myXMLReader.parse(myInputSource);

            myRssFeed = myRSSHandler.getFeed();

        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private void displayRss() {
        if (myRssFeed != null) {
            Calendar c = Calendar.getInstance();
            // String strCurrentTiime = "\n(Time of Reading - "
            // + c.get(Calendar.HOUR_OF_DAY)
            // + " Hrs. : "
            // + c.get(Calendar.MINUTE) + " Mins.)\n" +c.get(Calendar.AM_PM);

            SimpleDateFormat sdf = new SimpleDateFormat(
                    "MMMM-dd-yyyy HH:mm:ss a");
            String strCurrentTiime = sdf.format(c.getTime());

            feedTitle.setText(myRssFeed.getTitle());
            feedDescribtion.setText(strCurrentTiime);
            // feedPubdate.setText(myRssFeed.getPubdate());
            // feedLink.setText(myRssFeed.getLink());

            MyCustomAdapter adapter = new MyCustomAdapter(getActivity(), R.layout.row,
                    myRssFeed.getList());

   //------------------------------- Error 3 (Solved)-------------------------------
            setListAdapter(adapter);
   //------------------------------- Error 3-------------------------------

        }
    }

    @Override
   //------------------------------- Error 4 (Solved)-------------------------------
    protected void onListItemClick(ListView l, View v, int position, long id) {
   //------------------------------- Error 4-------------------------------
        // TODO Auto-generated method stub
        Intent intent = new Intent(getActivity(), ShowDetails.class);
        Bundle bundle = new Bundle();
        bundle.putString("keyTitle", myRssFeed.getItem(position).getTitle());
        bundle.putString("keyDescription", myRssFeed.getItem(position)
                .getDescription());
        bundle.putString("keyLink", myRssFeed.getItem(position).getLink());
        bundle.putString("keyPubdate", myRssFeed.getItem(position).getPubdate());
        intent.putExtras(bundle);
        startActivity(intent);
    }
}

Top_rated Fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/back"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/feedtitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/Black"
        android:layout_gravity="center"
        android:layout_marginTop="10dp"
        android:textStyle="bold" />

    <TextView
        android:textColor="@color/Black"
        android:id="@+id/feeddescribtion"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" />

    </LinearLayout>

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:divider="@drawable/divider" />

    <TextView
        android:id="@android:id/empty"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="No Data" />

</LinearLayout>

The 4 places with errors are marked in between the lines. Errors are:

**1: The method getLayoutInflater(Bundle) in the type Fragment is not applicable for the arguments () **

2: The method setListAdapter(null) is undefined for the type TopStoriesFragment (Solved by extending ListFragment instead of Fragment.)

3: The method setListAdapter(TopStoriesFragment.MyCustomAdapter) is undefined for the type TopStoriesFragment (Solved by extending ListFragment instead of Fragment.)

4: The method onListItemClick(ListView, View, int, long) of type TopStoriesFragment must override or implement a supertype method (Solved by adding public to the method)

Aishvarya Jaiswal
  • 1,793
  • 6
  • 34
  • 72

2 Answers2

2

hope I can help you.

1.The getLayoutInflater() method is giving you error because you have to save the inflater's instance from de onCreateView method

public LayoutInflater inflater

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    this.inflater = inflater;
}

Then you have to use it from that instance instead use getLayoutInflater()

The other way is passing the inflater as a param in the MyCustomAdapter constructor.

G3rcar
  • 21
  • 2
  • Yes.. It worked. But I have a new problem, I cant extend ListFragment, I have to extend Fragment only. And doing that is causing the errors 1, 2 and 4 coming again. Can you please help.? +1 and a lots of thanx for this answer.. Please help me more.. – Aishvarya Jaiswal Jul 02 '14 at 16:38
2

Your problems seem to be solvable by extending ListFragment instead of Fragment, but you say that you cannot do that. So let's take your problems one at a time:

1: The method getLayoutInflater(Bundle) in the type Fragment is not applicable for the arguments ()

As @G3rcar suggests, you can declare a LayoutInflater member field, initialize it with the LayoutInflater passed to the onCreateView method, and use that one in your later code. Alternatively, you can retrieve a LayoutInflater at any time within MyCustomAdapater.getView() using:

LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(
    Context.LAYOUT_INFLATER_SERVICE);

2: The method setListAdapter(null) is undefined for the type TopStoriesFragment (Solved by extending ListFragment instead of Fragment.)

Judging from your code, you could simply eliminate this call. Alternatively, see my suggestion for the next problem.

3: The method setListAdapter(TopStoriesFragment.MyCustomAdapter) is undefined for the type TopStoriesFragment (Solved by extending ListFragment instead of Fragment.)

The solution to both this problem and the previous one is to store a reference to the ListView when you first construct the fragment's view:

TextView feedTitle;
TextView feedDescribtion;
ListView listView;

public View onCreateView(...) {
    ...
    feedTitle = (TextView) rootView.findViewById(R.id.feedtitle);
    feedDescribtion = (TextView) rootView.findViewById(R.id.feeddescribtion);
    listView = (ListView) rootView.findViewById(android.R.id.list);
    ...
}

Then you can set the adapter for listView directly:

private void displayRss() {
    ...
    listView.setAdapter(adapter); // instead of "setAdapter(adapter)"
}

4: The method onListItemClick(ListView, View, int, long) of type TopStoriesFragment must override or implement a supertype method (Solved by adding public to the method)

You can explicitly set an OnItemClickListener for the ListView to respond to item clicks:

listView = (ListView) rootView.findViewById(android.R.id.list);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
       ... // body of your current onListItemClick() method
    }
});

You would then eliminate the method onListItemClick from TopStoriesFragment.

Ted Hopp
  • 232,168
  • 48
  • 399
  • 521
  • Thanks a lot. It solved all the errors. But I am facing a new problem of null pointer exception now. Please see [http://stackoverflow.com/questions/24538957/null-pointer-exception-on-layout-inflator](this) question. – Aishvarya Jaiswal Jul 02 '14 at 18:57