简体   繁体   English

片段上的自定义ListView

[英]Custom ListView on fragment

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. 我想使用基于xml的listview,因为主片段上还有其他元素。 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)

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. 在片段示例中检查此Android ListView,在片段android示例中检查创建Listview

There are lots of examples if you write "fragment with list views" on Google 如果您在Google上写“带有列表视图的片段”,则有很多示例

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

从logcat可以清楚地看出您在Adapter的getView()方法(即ReviewList)中犯了错误,您在getView中提到了3 TextView ...正确检查布局文件,其中一个视图必须是RelativeLayout ...这就是为什么你正在得到ClassCastException

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM