[英]RecyclerView in fragments not working properly
I want to make a RecyclerView
containing Cards
inside it.我想制作一个包含
Cards
的RecyclerView
。
The problem is that I'm getting something weird.问题是我得到了一些奇怪的东西。 Like shown in screenshot below (Notice the another card overlapping the card below - the card below is only what I want to be displayed ):
如下面的屏幕截图所示(注意另一张卡片与下面的卡片重叠 - 下面的卡片只是我想要显示的内容):
Here's ListContentAAR.java
file's code :这是
ListContentAAR.java
文件的代码:
class ListContentAAR {
int hImage;
String hPicTag;
String hDescription;
String hLocation;
Button btn_accept;
Button btn_share;
String postDate;
String postTime;
String postedBy;
ListContentAAR(int hImage,
String hPicTag,
String hDescription,
String hLocation,
Button btn_accept,
Button btn_share,
String postDate,
String postTime,
String postedBy) {
this.hImage = hImage;
this.hPicTag = hPicTag;
this.hDescription = hDescription;
this.hLocation = hLocation;
this.btn_accept = btn_accept;
this.btn_share = btn_share;
this.postDate = postDate;
this.postTime = postTime;
this.postedBy = postedBy;
}
}
Here's RVAdapterAAR.java
file's code :这是
RVAdapterAAR.java
文件的代码:
public class RVAdapterAAR extends RecyclerView.Adapter<RVAdapterAAR.PersonViewHolder> {
public static class PersonViewHolder extends RecyclerView.ViewHolder {
CardView cardView;
ImageView hImage;
TextView hPicTag;
TextView hDescription;
TextView hLocation;
Button btn_accept;
Button btn_share;
TextView postDate;
TextView postTime;
TextView postedBy;
PersonViewHolder(View itemView) {
super(itemView);
cardView = (CardView) itemView.findViewById(R.id.card_accept_request);
hImage = (ImageView) itemView.findViewById(R.id.h_pic_accept);
hPicTag = (TextView) itemView.findViewById(R.id.h_pic_tag);
hDescription = (TextView) itemView.findViewById(R.id.h_description_accept);
hLocation = (TextView) itemView.findViewById(R.id.h_location_tag);
btn_accept = (Button) itemView.findViewById(R.id.btn_accept);
btn_share = (Button) itemView.findViewById(R.id.btn_share);
postDate = (TextView) itemView.findViewById(R.id.post_date);
postTime = (TextView) itemView.findViewById(R.id.post_time);
postedBy = (TextView) itemView.findViewById(R.id.posted_by);
}
}
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.hImage.setImageResource(listContentAARs.get(i).hImage);
personViewHolder.hPicTag.setText(listContentAARs.get(i).hPicTag);
personViewHolder.hDescription.setText(listContentAARs.get(i).hDescription);
personViewHolder.hLocation.setText(listContentAARs.get(i).hLocation);
// something for btn_accept
// something for btn_share
personViewHolder.postDate.setText(listContentAARs.get(i).postDate);
personViewHolder.postTime.setText(listContentAARs.get(i).postTime);
personViewHolder.postedBy.setText(listContentAARs.get(i).postedBy);
}
public int getItemCount() {
return listContentAARs.size();
}
}
Here's AcceptARequest.java
file's code :这是
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;
public List<ListContentAAR> listContentAARs;
public 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 fragment
View rootView = inflater.inflate(R.layout.fragment_accept_a_request, container, false);
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(R.drawable.ic_action_facebook,
"H pic goes here",
"H description goes here",
"H location goes here",
R.id.btn_accept,
R.id.btn_share,
"date",
"time",
"posted by"));
}
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 name
void onFragmentInteraction(Uri uri);
}
}
Here's fragment_accept_a_request.xml
file's code :这是
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">
<include layout="@layout/accept_a_request_recyclerview"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/accept_request_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
</android.support.v7.widget.RecyclerView>
</RelativeLayout>
Here's accept_a_request_recyclerview.xml
file's code :这是
accept_a_request_recyclerview.xml
文件的代码:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
tools:showIn="@layout/fragment_accept_a_request">
<android.support.v7.widget.CardView
android:id="@+id/card_accept_request"
android:layout_width="match_parent"
android:layout_height="@dimen/card_accept_request"
app:cardElevation="2dp"
app:cardUseCompatPadding="true"
app:contentPadding="10dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/h_pic_accept"
android:layout_width="match_parent"
android:layout_height="@dimen/h_pic_dimen_accept"
android:layout_gravity="center_horizontal|center_vertical"/>
<TextView
android:id="@+id/h_pic_tag"
android:layout_width="match_parent"
android:layout_height="@dimen/homeless_pic_dimen_accept"
android:text="h pic goes here"
android:gravity="center_horizontal|center_vertical"/>
<TextView
android:id="@+id/h_description_accept"
android:layout_below="@+id/h_pic_tag"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal|center_vertical"
android:text="h description goes here"
android:maxLines="5"/>
<TextView
android:id="@+id/h_location_tag"
android:layout_below="@id/h_description_accept"
android:layout_width="match_parent"
android:layout_height="@dimen/h_pic_dimen_accept"
android:text="h location goes here"
android:gravity="center_horizontal|center_vertical"
android:paddingTop="@dimen/paddings"
android:paddingBottom="@dimen/paddings"/>
<LinearLayout
android:id="@+id/btn_accept_share_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_below="@id/h_location_tag">
<Button
android:id="@+id/btn_accept"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_accept"
android:textColor="@color/colorPrimary"
style="?android:attr/borderlessButtonStyle"/>
<Button
android:id="@+id/btn_share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_share"
android:textColor="@color/colorPrimary"
style="?android:attr/borderlessButtonStyle"/>
</LinearLayout>
<LinearLayout
android:id="@+id/date_time_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignEnd="@+id/btn_accept_share_container"
android:layout_alignRight="@+id/btn_accept_share_container"
android:orientation="vertical"
android:layout_below="@id/homeless_location_tag">
<TextView
android:id="@+id/post_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="date"/>
<TextView
android:id="@+id/post_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="time"/>
</LinearLayout>
<TextView
android:id="@+id/posted_by"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="posted by [name]"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"/>
</RelativeLayout>
</android.support.v7.widget.CardView>
</RelativeLayout>
As I'm a beginner, I totally have no idea about what is going wrong here!由于我是初学者,我完全不知道这里出了什么问题!
The mistake is that in onCreateViewHolder
you should only inflate the content of recyclerView item, but not the very RecyclerView.The right implementation is as follow:错误是在
onCreateViewHolder
你应该只膨胀 recyclerView 项目的内容,而不是 RecyclerView。正确的实现如下:
recyclerview_item.xml
<android.support.v7.widget.CardView
android:id="@+id/card_accept_request"
android:layout_width="match_parent"
android:layout_height="@dimen/card_accept_request"
app:cardElevation="2dp"
app:cardUseCompatPadding="true"
app:contentPadding="10dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/h_pic_accept"
android:layout_width="match_parent"
android:layout_height="@dimen/h_pic_dimen_accept"
android:layout_gravity="center_horizontal|center_vertical"/>
<TextView
android:id="@+id/h_pic_tag"
android:layout_width="match_parent"
android:layout_height="@dimen/h_pic_dimen_accept"
android:text="H pic goes here"
android:gravity="center_horizontal|center_vertical"/>
<TextView
android:id="@+id/h_description_accept"
android:layout_below="@+id/h_pic_tag"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal|center_vertical"
android:text="H description goes here"
android:maxLines="5"/>
<TextView
android:id="@+id/h_location_tag"
android:layout_below="@id/h_description_accept"
android:layout_width="match_parent"
android:layout_height="@dimen/h_pic_dimen_accept"
android:text="H location goes here"
android:gravity="center_horizontal|center_vertical"
android:paddingTop="@dimen/paddings"
android:paddingBottom="@dimen/paddings"/>
<LinearLayout
android:id="@+id/btn_accept_share_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_below="@id/homeless_location_tag">
<Button
android:id="@+id/btn_accept"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_accept"
android:textColor="@color/colorPrimary"
style="?android:attr/borderlessButtonStyle"/>
<Button
android:id="@+id/btn_share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_share"
android:textColor="@color/colorPrimary"
style="?android:attr/borderlessButtonStyle"/>
</LinearLayout>
<LinearLayout
android:id="@+id/date_time_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignEnd="@+id/btn_accept_share_container"
android:layout_alignRight="@+id/btn_accept_share_container"
android:orientation="vertical"
android:layout_below="@id/homeless_location_tag">
<TextView
android:id="@+id/post_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="date"/>
<TextView
android:id="@+id/post_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="time"/>
</LinearLayout>
<TextView
android:id="@+id/posted_by"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="posted by [name]"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"/>
</RelativeLayout>
</android.support.v7.widget.CardView>
your_fragment_layout.xml
<android.support.v7.widget.RecyclerView
android:id="@+id/accept_request_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
</android.support.v7.widget.RecyclerView>
In your Activity you inflate Fragment from your_fragment_layout.xml
and then in onCreateViewHolder
you should replace this line:在您的 Activity 中,您从
your_fragment_layout.xml
膨胀 Fragment,然后在onCreateViewHolder
您应该替换此行:
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.fragment_accept_a_request, viewGroup, false);
on this line :在这一行:
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recyclerview_item, viewGroup, false);
After messing up a lot with this problem, I finally figured out the solution.在对这个问题搞砸了很多之后,我终于找到了解决方案。
It was simple.这很简单。
I just changed the RelativeLayout
to LinearLayout
, and it worked like a charm!我刚刚将
RelativeLayout
更改为LinearLayout
,它就像一个魅力!
Here's the final fragment_accept_a_request.xml
file's code :这是最终的
fragment_accept_a_request.xml
文件的代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="com.humanehelper.humanehelper.AcceptARequest">
<android.support.v7.widget.RecyclerView
android:id="@+id/accept_request_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
<include layout="@layout/accept_a_request_recyclerview"/>
</LinearLayout>
and here's accept_a_request_recyclerview.xml
file's code :这是
accept_a_request_recyclerview.xml
文件的代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
tools:showIn="@layout/fragment_accept_a_request">
<android.support.v7.widget.CardView
android:id="@+id/card_accept_request"
android:layout_width="match_parent"
android:layout_height="@dimen/card_accept_request"
app:cardElevation="2dp"
app:cardUseCompatPadding="true"
app:contentPadding="10dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/h_pic_accept"
android:layout_width="match_parent"
android:layout_height="@dimen/h_pic_dimen_accept"
android:layout_gravity="center_horizontal|center_vertical"/>
<TextView
android:id="@+id/h_pic_tag"
android:layout_width="match_parent"
android:layout_height="@dimen/homeless_pic_dimen_accept"
android:text="h pic goes here"
android:gravity="center_horizontal|center_vertical"/>
<TextView
android:id="@+id/h_description_accept"
android:layout_below="@+id/h_pic_tag"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal|center_vertical"
android:text="h description goes here"
android:maxLines="5"/>
<TextView
android:id="@+id/h_location_tag"
android:layout_below="@id/h_description_accept"
android:layout_width="match_parent"
android:layout_height="@dimen/h_pic_dimen_accept"
android:text="h location goes here"
android:gravity="center_horizontal|center_vertical"
android:paddingTop="@dimen/paddings"
android:paddingBottom="@dimen/paddings"/>
<LinearLayout
android:id="@+id/btn_accept_share_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_below="@id/h_location_tag">
<Button
android:id="@+id/btn_accept"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_accept"
android:textColor="@color/colorPrimary"
style="?android:attr/borderlessButtonStyle"/>
<Button
android:id="@+id/btn_share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_share"
android:textColor="@color/colorPrimary"
style="?android:attr/borderlessButtonStyle"/>
</LinearLayout>
<LinearLayout
android:id="@+id/date_time_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignEnd="@+id/btn_accept_share_container"
android:layout_alignRight="@+id/btn_accept_share_container"
android:orientation="vertical"
android:layout_below="@id/homeless_location_tag">
<TextView
android:id="@+id/post_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="date"/>
<TextView
android:id="@+id/post_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="time"/>
</LinearLayout>
<TextView
android:id="@+id/posted_by"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="posted by [name]"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"/>
</RelativeLayout>
</android.support.v7.widget.CardView>
</LinearLayout>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.