0

I'm trying to get my custom listview on a fragment, but I can only accomplish it through an activity.

here's my code:

MyActivity:   

package com.teampainite.testreviews;

import android.app.Activity; 
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.RatingBar;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;


public class MyActivity extends Activity {
private List<ReviewAdapter> Review = new ArrayList<ReviewAdapter>();


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

    populateReviews();
    populateReviewList();
}

private void populateReviewList() {
    Review.add(new ReviewAdapter("Okay", 4, "Levi", "This is an example"));
}

private void populateReviews() {
    ArrayAdapter<ReviewAdapter> adapter = new ReviewList();
    ListView list = (ListView) findViewById(R.id.list);
    list.setFastScrollEnabled(true);
    list.setAdapter(adapter);
}

private class ReviewList extends ArrayAdapter<ReviewAdapter> {
    public ReviewList() {
        super(MyActivity.this, R.layout.review_layout, Review);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View ReviewView = convertView;
        if(ReviewView == null){
            ReviewView = getLayoutInflater().inflate(R.layout.review_layout, parent, false);
        }

        //Find view
        ReviewAdapter currentReview = Review.get(position);

        TextView title = (TextView)ReviewView.findViewById(R.id.review_list_title);
        RatingBar rating = (RatingBar)ReviewView.findViewById(R.id.review_rating);
        TextView user = (TextView)ReviewView.findViewById(R.id.review_user);
        TextView review = (TextView)ReviewView.findViewById(R.id.review_content);

        title.setText(currentReview.getTitle());
        rating.setRating(currentReview.getRating());
        user.setText(currentReview.getUser());
        review.setText(currentReview.getReview());

        rating.setEnabled(false);

        return ReviewView;
    }


}
}

ReviewAdapter:

package com.teampainite.testreviews;

public class ReviewAdapter {
private String Title;
private float Rating;
private String User;
private String Review;


public ReviewAdapter(String Title, float Rating, String User, String Review){
    super();
    this.Title = Title;
    this.Rating = Rating;
    this.User = User;
    this.Review = Review;
}

public String getTitle(){

    return Title;
}

public float getRating(){

    return Rating;
}

public String getUser(){

    return User;
}

public String getReview(){
    return Review;
}

}

Can someone help me put this on a fragment? I want to use an xml based listview, because there are other elements on the main fragment. No other question has addressed this, that I've been able to find.

Fragment code:

package com.teampainite;


import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RatingBar;
import android.widget.TextView;

import com.teampainite.adapter.ReviewAdapter;

import java.util.ArrayList;
import java.util.List;

public class RestarauntFragment extends Fragment {
private List<ReviewAdapter> Review = new ArrayList<ReviewAdapter>();


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

LayoutInflater inflater;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    setHasOptionsMenu(true);// Inflate the layout for this fragment

    return inflater.inflate(R.layout.fragment_restaraunt, container, false);
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    ArrayAdapter<ReviewAdapter> adapter = new ArrayAdapter(getActivity(), R.layout.review_list_item, Review);
    ListView list = (ListView)view.findViewById(R.id.reviews_list);
    list.setAdapter(adapter);

    final ImageView favorite = (ImageView) view.findViewById(R.id.favorite);
    favorite.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            favorite.setImageDrawable(getActivity().getResources().getDrawable(R.drawable.ic_action_favorite_full));
        }
    });
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.restaraunt, menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            showStoreListings();
            break;
        case R.id.show_menu:
            showMenu();
            break;
    }
    return super.onOptionsItemSelected(item);
}

private void showStoreListings() {
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.hide(RestarauntFragment.this);
    transaction.replace(android.R.id.widget_frame, new HomeFragment()).commit();
}

private void showMenu() {
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.hide(RestarauntFragment.this);
    transaction.replace(android.R.id.widget_frame, new MenuFragment()).commit();
}


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
    getActivity().setTitle("Applebees");
    populateReviewList();
}

private void populateReviewList() {
    Review.add(new ReviewAdapter("Okay", 1, "Levi", "This is an example")
 }

private class ReviewList extends ArrayAdapter<ReviewAdapter> {
    public ReviewList() {
        super(getActivity(), R.layout.review_list_item, Review);
    }
    public View getView(LayoutInflater inflater, int position, View convertView, ViewGroup parent) {
        View ReviewView = convertView;
        if (ReviewView == null) {
            ReviewView = inflater.inflate(R.layout.review_list_item, parent, false);
        }

        //Find view
        ReviewAdapter currentReview = Review.get(position);

        TextView title = (TextView) ReviewView.findViewById(R.id.review_list_title);
        RatingBar rating = (RatingBar) ReviewView.findViewById(R.id.review_rating);
        TextView user = (TextView) ReviewView.findViewById(R.id.review_user);
        TextView review = (TextView) ReviewView.findViewById(R.id.review_content);

        title.setText(currentReview.getTitle());
        rating.setRating(currentReview.getRating());
        user.setText(currentReview.getUser());
        review.setText(currentReview.getReview());

        rating.setEnabled(false);

        return ReviewView;
    }
} 
}

There are no error, but when I launch I get this:

     08-29 23:15:20.876  27575-27575/com.teampainite.you_r_next E/ArrayAdapter﹕ You must supply a resource ID for a TextView
08-29 23:15:20.876  27575-27575/com.teampainite.you_r_next D/AndroidRuntime﹕ Shutting down VM
08-29 23:15:20.876  27575-27575/com.teampainite.you_r_next W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41615930)
08-29 23:15:21.507  27575-27575/com.teampainite.you_r_next E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView
            at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:386)
            at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
            at android.widget.AbsListView.obtainView(AbsListView.java:2159)
            at android.widget.ListView.onMeasure(ListView.java:1130)
            at android.view.View.measure(View.java:15513)
            at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:645)
            at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:425)
            at android.view.View.measure(View.java:15513)
            at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1217)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at android.widget.ScrollView.onMeasure(ScrollView.java:321)
            at android.view.View.measure(View.java:15513)
            at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:645)
            at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:425)
            at android.view.View.measure(View.java:15513)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at android.view.View.measure(View.java:15513)
            at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:762)
            at android.view.View.measure(View.java:15513)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at android.view.View.measure(View.java:15513)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:847)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
            at android.view.View.measure(View.java:15513)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2176)
            at android.view.View.measure(View.java:15513)
            at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1874)
            at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1089)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1265)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
            at android.view.Choreographer.doCallbacks(Choreographer.java:562)
            at android.view.Choreographer.doFrame(Choreographer.java:532)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
            at android.os.Handler.handleCallback(Handler.java:725)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5191)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.ClassCastException: android.widget.RelativeLayout cannot be cast to android.widget.TextView
            at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:379)
            at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
            at android.widget.AbsListView.obtainView(AbsListView.java:2159)
            at android.widget.ListView.onMeasure(ListView.java:1130)
            at android.view.View.measure(View.java:15513)
            at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:645)
            at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:425)
            at android.view.View.measure(View.java:15513)
            at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1217)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at android.widget.ScrollView.onMeasure(ScrollView.java:321)
            at android.view.View.measure(View.java:15513)
            at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:645)
            at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:425)
            at android.view.View.measure(View.java:15513)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at android.view.View.measure(View.java:15513)
            at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:762)
            at android.view.View.measure(View.java:15513)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at android.view.View.measure(View.java:15513)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:847)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
            at android.view.View.measure(View.java:15513)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2176)
            at android.view.View.measure(View.java:15513)
            at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1874)
            at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1089)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1265)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
            at android.view.Choreographer.doCallbacks(Choreographer.java:562)
            at android.view.Choreographer.doFrame(Choreographer.java:532)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
            at android.os.Handler.handleCallback(Handler.java:725)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5191)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
            at dalvik.system.NativeStart.main(Native Method)
  • In Fragment you have to call your method in onCreateView() – Piyush Aug 30 '14 at 04:07
  • I know that, but it's still not working. Give me a few minutes and I can post my attempt on getting it onto a fragment – Levi Snyder Aug 30 '14 at 04:08
  • i do not understand you want to access listview from your fragment? – mmlooloo Aug 30 '14 at 04:08
  • I added my fragment attempt. Also, yes, I want to see the listview on the fragment, see, I have other listviews on it already, that show just fine, but I cant get the custom listview to show. – Levi Snyder Aug 30 '14 at 04:17
  • do you know the difference of `fragment` and `activity`? here you post activity. and also do you want us to debugge it yes? is it all your question? – mmlooloo Aug 30 '14 at 04:32
  • Yes, I kind of know. I posted the working activity, and then my attempt at putting it on a fragment, I'm asking for help to make it work. – Levi Snyder Aug 30 '14 at 04:36
  • The Activity is from a separate project where I tested it, to make sure it worked. The fragment if from the project I used the test for. If you know what I'm trying to say.. – Levi Snyder Aug 30 '14 at 04:37
  • i can help you but i can not understand you, a bit not clear for me, this error cause not to show your listview in activity after that you must attach your fragment to this activity and then get it from activity. – mmlooloo Aug 30 '14 at 04:39
  • Okay, so construct everything inside the activity, but set the adapter in the fragment? – Levi Snyder Aug 30 '14 at 04:51
  • it depends on your program i do not know when fragment is going to attach and ... but in this codes you have not attached it yet!! – mmlooloo Aug 30 '14 at 05:03
  • Okay, well the fragment is a selection, I'm not sure if attaching is the same as when it takes up the container view on the activity_main.xml. – Levi Snyder Aug 30 '14 at 05:08

2 Answers2

0

No other question has addressed this, that I've been able to find.

Please check this Android ListView in fragment example and Create listview in fragment android example.

There are lots of examples if you write "fragment with list views" on Google

Check this: https://www.google.co.in/?gfe_rd=cr&ei=uU0BVJzYIsHN8geZ8IBI&gws_rd=ssl#q=fragment+with+list+views

Community
  • 1
  • 1
Nitin
  • 1,966
  • 4
  • 22
  • 53
  • The first link only shows classes extending Activity, not fragment, and as for the second link, they only show links to listfragments, and I need a standard fragment. – Levi Snyder Aug 30 '14 at 04:19
  • Have you checked this one http://www.easyinfogeek.com/2013/07/full-example-of-using-fragment-in.html – Nitin Aug 30 '14 at 04:22
0

From the logcat it is clear that you are making mistake inside getView() method of Adapter (i.e. ReviewList) you have mentioned 3 TextView inside getView...check your layout file properly one of the view must be RelativeLayout...That is why you are getting ClassCastException

Shadow Droid
  • 1,696
  • 1
  • 12
  • 26