我知道了!
问题出在两个文件中。
劳拉托所说的第一个问题是fragment_accept_a_request.xml。从XML元素中删除XML元素recyclerView并将其放置在其下方,但使用相同的父布局完成了这项工作。
第二个问题是AcceptARequest.java。在这里我声明了两个RecyclerView一个是initialiseData()方法和另一个用于声明recyclerView。
:
<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='wrap_content'android:paddingLeft='@dimen/activity_horizontal_margin'android:paddingRight='@dimen/activity_horizontal_margin'android:paddingTop='@dimen/activity_vertical_margin'android:paddingBottom='@dimen/activity_vertical_margin'xmlns:app='http://schemas.android.com/apk/res-auto'tools:context='com.abc.xyz.AcceptARequest'> <android.support.v7.widget.RecyclerViewandroid: android:layout_width='match_parent'android:layout_height='match_parent'android:background='@android:color/white'app:layout_behavior='@string/appbar_scrolling_view_behavior'> </android.support.v7.widget.RecyclerView> <android.support.v7.widget.CardViewandroid: android:layout_width='match_parent'android:layout_height='@dimen/card_accept_request'app:cardElevation='2dp'app:cardUseCompatPadding='true'app:contentPadding='10dp'><!--<ImageView android: android:layout_width='match_parent' android:layout_height='@dimen/pic_dimen_accept' android:layout_gravity='center_horizontal|center_vertical' android:layout_alignParentTop='true'/> --><TextView android: android:layout_width='match_parent' android:layout_height='@dimen/pic_dimen_accept' android:text='@string/image_view_tag_accept' android:gravity='center_horizontal|center_vertical'/> </android.support.v7.widget.CardView></RelativeLayout>解决方法
我recyclerview在我的应用程序中做了一个
问题是,java.lang.IllegalStateException: RecyclerView has noLayoutManager即使定义了错误,我也会收到以下错误:
这是ListContentAAR.java文件的代码:
class ListContentAAR { String picTag; ListContentAAR( String picTag) {this.picTag = picTag; }}
这是RVAdapterAAR.java文件的代码:
public class RVAdapterAAR extends RecyclerView.Adapter<RVAdapterAAR.PersonViewHolder> { public static class PersonViewHolder extends RecyclerView.ViewHolder {CardView cardView;TextView pic;PersonViewHolder(View itemView) { super(itemView); cardView = (CardView) itemView.findViewById(R.id.card_accept_request); homelessPic = (TextView) itemView.findViewById(R.id.pic_tag);} } List<ListContentAAR> listContentAARs; RVAdapterAAR(List<ListContentAAR> listContentAARs) {this.listContentAARs = listContentAARs; } public void onAttachedToRecyclerView(RecyclerView recyclerView) {super.onAttachedToRecyclerView(recyclerView); } public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup,int i) {View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.fragment_accept_a_request,viewGroup,false);PersonViewHolder personViewHolder = new PersonViewHolder(view);return personViewHolder; } public void onBindViewHolder (PersonViewHolder personViewHolder,int i) {personViewHolder.pic.setText(listContentAARs.get(i).homelessPicTag); } public int getItemCount() {return listContentAARs.size(); }}
这是AcceptARequest.java文件的代码:
public class AcceptARequest extends Fragment { // TODO: Rename parameter arguments,choose names that match // the fragment initialization parameters,e.g. ARG_ITEM_NUMBER private static final String ARG_PARAM1 = 'param1'; private static final String ARG_PARAM2 = 'param2'; // TODO: Rename and change types of parameters private String mParam1; private String mParam2; private OnFragmentInteractionListener mListener; private List<ListContentAAR> listContentAARs; private RecyclerView recyclerView; public AcceptARequest() {// Required empty public constructor } /** * Use this factory method to create a new instance of * this fragment using the provided parameters. * * @param param1 Parameter 1. * @param param2 Parameter 2. * @return A new instance of fragment AcceptARequest. */ // TODO: Rename and change types and number of parameters public static AcceptARequest newInstance(String param1,String param2) {AcceptARequest fragment = new AcceptARequest();Bundle args = new Bundle();args.putString(ARG_PARAM1,param1);args.putString(ARG_PARAM2,param2);fragment.setArguments(args);return fragment; } @Override public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (getArguments() != null) { mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2);} } @Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentView rootView = inflater.inflate(R.layout.fragment_accept_a_request,container,false);RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.accept_request_list);LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());recyclerView.setLayoutManager(linearLayoutManager);recyclerView.setHasFixedSize(true);initializeData();initializeAdapter();return rootView; } private void initializeData(){listContentAARs = new ArrayList<>();listContentAARs.add(new ListContentAAR('Emma Wilson')); } private void initializeAdapter(){RVAdapterAAR adapter = new RVAdapterAAR(listContentAARs);recyclerView.setAdapter(adapter); } // TODO: Rename method,update argument and hook method into UI event public void onButtonPressed(Uri uri) {if (mListener != null) { mListener.onFragmentInteraction(uri);} } @Override public void onDetach() {super.onDetach();mListener = null; } /** * This interface must be implemented by activities that contain this * fragment to allow an interaction in this fragment to be communicated * to the activity and potentially other fragments contained in that * activity. * <p/> * See the Android Training lesson <a href= * 'http://developer.android.com/training/basics/fragments/communicating.html' * >Communicating with Other Fragments</a> for more information. */ public interface OnFragmentInteractionListener {// TODO: Update argument type and namevoid onFragmentInteraction(Uri uri); }}
这是fragment_accept_a_request.xml文件的代码:
<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='wrap_content'android:paddingLeft='@dimen/activity_horizontal_margin'android:paddingRight='@dimen/activity_horizontal_margin'android:paddingTop='@dimen/activity_vertical_margin'android:paddingBottom='@dimen/activity_vertical_margin'xmlns:app='http://schemas.android.com/apk/res-auto'tools:context='com.abc.xyz.AcceptARequest'> <android.support.v7.widget.RecyclerViewandroid: android:layout_width='match_parent'android:layout_height='match_parent'android:background='@android:color/white'app:layout_behavior='@string/appbar_scrolling_view_behavior'><android.support.v7.widget.CardView android: android:layout_width='match_parent' android:layout_height='@dimen/card_accept_request' app:cardElevation='2dp' app:cardUseCompatPadding='true' app:contentPadding='10dp'> <!--<ImageViewandroid: android:layout_width='match_parent'android:layout_height='@dimen/pic_dimen_accept'android:layout_gravity='center_horizontal|center_vertical'android:layout_alignParentTop='true'/> --> <TextViewandroid: android:layout_width='match_parent'android:layout_height='@dimen/pic_dimen_accept'android:text='@string/image_view_tag_accept'android:gravity='center_horizontal|center_vertical'/></android.support.v7.widget.CardView> </android.support.v7.widget.RecyclerView></RelativeLayout>
这是MainActivity.java文件的代码:
public class MainActivity extends AppCompatActivity { /** * The {@link android.support.v4.view.PagerAdapter} that will provide * fragments for each of the sections. We use a * {@link FragmentPagerAdapter} derivative,which will keep every * loaded fragment in memory. If this becomes too memory intensive,it * may be best to switch to a * {@link android.support.v4.app.FragmentStatePagerAdapter}. */ public SectionsPagerAdapter mSectionsPagerAdapter; /** * The {@link ViewPager} that will host the section contents. */ private ViewPager mViewPager; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Typeface typeFace = Typeface.createFromAsset(getAssets(),'fonts/Pacifico.ttf');Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);TextView mTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);mTitle.setTypeface(typeFace);toolbar.setTitle(mTitle.getText().toString());setSupportActionBar(toolbar);getSupportActionBar().setDisplayShowTitleEnabled(false);// Create the adapter that will return a fragment for each of the three// primary sections of the activity.mSectionsPagerAdapter = new SectionsPagerAdapter(this,getSupportFragmentManager());// Set up the ViewPager with the sections adapter.mViewPager = (ViewPager) findViewById(R.id.container);mViewPager.setAdapter(mSectionsPagerAdapter);TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);tabLayout.setupWithViewPager(mViewPager);/*FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) {Snackbar.make(view,'Replace with your own action',Snackbar.LENGTH_LONG).setAction('Action',null).show(); }});*/ } @Override public boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.menu_main,menu);return true; } @Override public boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button,so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();//noinspection SimplifiableIfStatementif (id == R.id.action_settings) { Intent settingsIntent = new Intent(MainActivity.this,SettingsActivity.class); startActivity(settingsIntent);} else if (id == R.id.action_profile) { Intent profileIntent = new Intent(MainActivity.this,ProfileActivity.class); startActivity(profileIntent);} else if (id == R.id.action_send_feedback) { Intent sendFeedbackIntent = new Intent(MainActivity.this,SendFeedback.class); startActivity(sendFeedbackIntent);} else if (id == R.id.action_help) { Intent helpIntent = new Intent(MainActivity.this,HelpActivity.class); startActivity(helpIntent);}return super.onOptionsItemSelected(item); } public class SectionsPagerAdapter extends FragmentPagerAdapter {protected Context mContext;public SectionsPagerAdapter(Context context,FragmentManager fm) { super(fm); mContext = context;}@Overridepublic Fragment getItem(int position) { // getItem is called to instantiate the fragment for the given page. // Return a PlaceholderFragment (defined as a static inner class below). // return MainActivity.PlaceholderFragment.newInstance(position + 1); switch (position) {case 0: return new AcceptARequest();case 1: return new PostARequest();default: return new AcceptARequest(); // return AcceptARequest() actually }}@Overridepublic int getCount() { // Show 2 total pages. return 2;}@Overridepublic CharSequence getPageTitle(int position) { Locale l = Locale.getDefault(); switch (position) {case 0: return 'Accept A Request';case 1: return 'Post A Request'; } return null;} } /** * A placeholder fragment containing a simple view. */ public static class PlaceholderFragment extends Fragment {/** * The fragment argument representing the section number for this * fragment. */private static final String ARG_SECTION_NUMBER = 'section_number';/** * Returns a new instance of this fragment for the given section * number. */public static PlaceholderFragment newInstance(int sectionNumber) { PlaceholderFragment fragment = new PlaceholderFragment(); Bundle args = new Bundle(); args.putInt(ARG_SECTION_NUMBER,sectionNumber); fragment.setArguments(args); return fragment;}public PlaceholderFragment() {}@Overridepublic View onCreateView(LayoutInflater inflater,Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main,false); TextView textView = (TextView) rootView.findViewById(R.id.section_label); textView.setText(getString(R.string.section_format,getArguments().getInt(ARG_SECTION_NUMBER))); return rootView;} }}
这是stacktrace:
FATAL EXCEPTION: main java.lang.IllegalStateException: RecyclerView has no LayoutManager at android.support.v7.widget.RecyclerView.generateLayoutParams(RecyclerView.java:3182) at android.view.LayoutInflater.rInflate(LayoutInflater.java:748) at android.view.LayoutInflater.rInflate(LayoutInflater.java:749) at android.view.LayoutInflater.inflate(LayoutInflater.java:489) at android.view.LayoutInflater.inflate(LayoutInflater.java:396) at com.humanehelper.humanehelper.AcceptARequest.onCreateView(AcceptARequest.java:75) at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613) at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570) at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) at android.support.v4.view.ViewPager.populate(ViewPager.java:1106) at android.support.v4.view.ViewPager.populate(ViewPager.java:952) at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1474) at android.view.View.measure(View.java:15172) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814) at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:610) at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:677) at android.view.View.measure(View.java:15172) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135) at android.view.View.measure(View.java:15172) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390) at android.widget.LinearLayout.measureVertical(LinearLayout.java:681) at android.widget.LinearLayout.onMeasure(LinearLayout.java:574) at android.view.View.measure(View.java:15172) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at android.view.View.measure(View.java:15172) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390) at android.widget.LinearLayout.measureVertical(LinearLayout.java:681) at android.widget.LinearLayout.onMeasure(LinearLayout.java:574) at android.view.View.measure(View.java:15172) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2148) at android.view.View.measure(View.java:15172) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1848) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1100) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1273) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) at android.view.Choreographer.doCallbacks(Choreographer.java:555) at android.view.Choreographer.doFrame(Choreographer.java:525) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4745) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com
由于我是初学者,所以无法弄清楚为什么会出现以下错误。
请告诉我。
提前致谢。