【问题标题】:Custom ListView on fragment片段上的自定义 ListView
【发布时间】:2014-08-30 04:00:50
【问题描述】:

我正在尝试在片段上获取我的自定义列表视图,但我只能通过活动来完成它。

这是我的代码:

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

}

有人可以帮我把它放在一个片段上吗?我想使用基于 xml 的列表视图,因为主片段上还有其他元素。没有其他问题可以解决这个问题,我已经找到了。

片段代码:

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

没有错误,但是当我启动时,我得到了这个:

     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)

【问题讨论】:

  • 在 Fragment 中你必须在 onCreateView() 中调用你的方法
  • 我知道,但还是不行。给我几分钟,我可以将我的尝试发布到片段上
  • 我不明白你想从你的片段访问列表视图?
  • 我添加了我的片段尝试。另外,是的,我想查看片段上的列表视图,看,我已经有其他列表视图,显示得很好,但我无法显示自定义列表视图。
  • 你知道fragmentactivity的区别吗?在这里你发布活动。你也想让我们调试它吗?都是你的问题吗?

标签: java android android-fragments android-listview


【解决方案1】:

没有其他问题可以解决这个问题,我已经找到了。

请查看Android ListView in fragment exampleCreate listview in fragment android 例子。

如果你在 Google 上写“带有列表视图的片段”,会有很多例子

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

【讨论】:

【解决方案2】:

从 logcat 很明显,您在适配器的 getView() 方法中犯了错误(即 ReviewList) 您提到了 3 TextView 在 getView 内...正确检查您的布局文件,其中一个视图必须是 RelativeLayout...这就是为什么您会收到 ClassCastException em>

【讨论】:

  • 我放什么,放什么? D:
猜你喜欢
  • 2023-04-01
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 2014-04-28
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多