问题
I have a Dialogue Fragment which a RecycleView will shown inside it.This is driving me crazy,cause I almost see all the SO question about RecycleView not show up problem,but still not solving my problem.Please take a look in my code
Here is my Fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/titlebar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Be the first to like this"
android:layout_marginLeft="@dimen/feed_item_margin"
android:layout_marginRight="@dimen/feed_item_margin"
android:layout_marginTop="@dimen/feed_item_margin"/>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="@color/dialog"
android:layout_marginTop="10dp"
android:paddingRight="@dimen/comment_item_status_pad_left_right"
android:paddingLeft="@dimen/comment_item_status_pad_left_right"
android:layout_below="@+id/titlebar"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/comment_recycler_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:animateLayoutChanges="false"
android:scrollbars="vertical" />
<LinearLayout
android:id="@+id/commentInsert"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_alignParentBottom="true"
android:background="@android:color/white"
android:orientation="horizontal" >
<EditText
android:id="@+id/commentField"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:hint="Add a comment"
android:background="@null"/>
<Button
android:id="@+id/sendButton"
android:layout_width="77dp"
android:layout_height="wrap_content"
android:text="Send" />
</LinearLayout>
Fragment.java set the recycleview to the Fragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Remove TITLE
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
View dialogView = inflater.inflate(R.layout.fragment_comment, container,false);
commentRecyclerView =(RecyclerView)dialogView.findViewById(R.id.comment_recycler_view);
commentRecyclerView.setNestedScrollingEnabled(false);
//bind the recycler view with the adapter
commentAdapter = new CommentAdapter(this.getActivity(),commentItems);
final LinearLayoutManager mLayoutManager = new LinearLayoutManager(this.getActivity());
commentRecyclerView.setLayoutManager(mLayoutManager);
commentRecyclerView.setAdapter(commentAdapter);
Here I make Request to server
private void fetchItem(int item_id){
// making fresh volley request and getting json
JsonObjectRequest jsonReq = new JsonObjectRequest(Request.Method.GET,
URL_GET_ITEM + item_id, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
VolleyLog.d(AppController.TAG, "VolleyResponse: " + response.toString());
Log.d("responseGet",response.toString());
parseJsonFeed(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(AppController.TAG, "Error: " + error.getMessage());
}
}) {
//adding header to authenticate
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String,String> headers = new HashMap<>();
headers.put("Content-Type", "application/json");
return headers;
}
};
// Adding request to volley request queue
AppController.getInstance().addToRequestQueue(jsonReq);
}
Here I parse the json feed
private void parseJsonFeed(JSONObject response) {
try {
JSONArray itemArray = response.getJSONArray("item");
//get all the item in Json
for (int i = 0; i < itemArray.length(); i++) {
JSONObject itemObj = (JSONObject) itemArray.get(i);
itemId = itemObj.getInt("item_id");
itemUsername= itemObj.getString("item_username");
itemBody = itemObj.getString("item_body");
itemProfileImage = itemObj.getString("item_profile_image");
itemCreatedAt = itemtObj.getString("item_created_at");
//set all item to the Array list
setItemToCommentArrayList(itemId,itemUsername,itemProfileImage,itemBody,itemCreatedAt);
}
// notify data changes to list adapter
itemAdapter.notifyDataSetChanged();
}catch (JSONException e){
System.out.println("end of content");
}
}
Here I add all the details to the Item.java
model
private void setItemToCommentArrayList(int itemId, String itemUsername, String itemrofileImage, String itemBody, String itemCreatedAt) {
CommentItem item = new CommentItem();
item.setCommentId(itemId);
item.setUsername(itemUsername);
item.setCommentProfilePic(itemProfileImage);
item.setCommentBody(itemBody);
item.setCommentTimeStamp(itemCreatedAt);
//save it to the comment array list
items.add(item);
}
Here is the comment_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/commentProfilePic"
android:layout_width="@dimen/comment_item_profile_pic"
android:layout_height="@dimen/comment_item_profile_pic"
android:layout_marginLeft="@dimen/feed_item_margin"
android:layout_marginRight="@dimen/feed_item_margin"
android:layout_marginTop="@dimen/feed_item_margin"
android:scaleType="fitCenter" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/feed_item_margin"
android:layout_marginRight="@dimen/feed_item_margin"
android:layout_marginTop="@dimen/feed_item_margin"
android:orientation="vertical"
android:paddingLeft="@dimen/comment_item_profile_info_padd">
<TextView
android:id="@+id/commentUsername"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingLeft="@dimen/comment_item_status_pad_left_right"
android:paddingRight="@dimen/comment_item_status_pad_left_right"
android:textStyle="bold" />
<TextView
android:id="@+id/commentBody"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingLeft="@dimen/comment_item_status_pad_left_right"
android:paddingRight="@dimen/comment_item_status_pad_left_right" />
<TextView
android:id="@+id/commentTimestamp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingLeft="@dimen/comment_item_status_pad_left_right"
android:paddingRight="@dimen/comment_item_status_pad_left_right"
android:paddingTop="@dimen/comment_item_timestamp_pad_top" />
</LinearLayout>
</LinearLayout>
Lastly,here is the adapter
public class CommentAdapter extends RecyclerView.Adapter<CommentAdapter.MyViewHolder>{
private Context mContext;
private List<CommentItem> commentItems;
class MyViewHolder extends RecyclerView.ViewHolder{
TextView commentBody,commentUsername,commentTimeStamp;
ImageView commentProfilePic;
//find all the view here
MyViewHolder(final View view) {
super(view);
commentProfilePic = (ImageView)view.findViewById(R.id.commentProfilePic);
commentUsername = (TextView)view.findViewById(R.id.commentUsername);
commentBody = (TextView)view.findViewById(R.id.commentBody);
commentTimeStamp = (TextView)view.findViewById(R.id.commentTimestamp);
}
}
public CommentAdapter(Context mContext, List<CommentItem> commentItems) {
this.mContext = mContext;
this.commentItems = commentItems;
}
@Override
public long getItemId(int position) {
return position;
}
//this one for make the adview inside this
@Override
public int getItemViewType(int position) {
return position;
}
//bind the comment item here
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View commentItemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.comment_item, parent, false);
return new MyViewHolder(commentItemView);
}
//do all the action here
@Override
public void onBindViewHolder(CommentAdapter.MyViewHolder holder, int position) {
final CommentItem commentItem = commentItems.get(position);
//commenter username
holder.commentUsername.setText(commentItem.getUsername());
//commenter profile image
Glide
.with(mContext)
.load(commentItem.getCommentProfilePic())
.fitCenter()
.into(holder.commentProfilePic);
//comment body
holder.commentBody.setText(commentItem.getCommentBody());
//comment timestamp
holder.commentTimeStamp.setText(commentItem.getCommentTimeStamp());
}
@Override
public int getItemCount() {
return commentItems.size();
}
}
I almost check everything with my another RecycleView,I didnt see any different.And also see all the Stackoverflow question too,I still cant see what happen.It just didnt show any item in the recycleview.Somebody please help
UPDATE I just change the layout in Fragment.xml from RelativeLayout to LinearLayout,it still not working.
I change the layout_height
to match_parent
,remove this line as well android:layout_weight="1"
,still not show up the item.As below
Tried change to Linear Layout as parent, android:layout_height="500dp"
as well,not shown up also
<android.support.v7.widget.RecyclerView
android:id="@+id/comment_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="false"
android:scrollbars="vertical" />
回答1:
Most probably issue with android:layout_weight="1"
You havent used weights anywhere other than the RecyclerView in parent Layout.
android:layout_height="0dp"
android:layout_weight="1"
Here height is 0dp and weight is used in a RelativeLayout. These wont work.
First of all, weights wont work with RelativeLayouts. Your Recycler view is child of RelativeLayout. So, if you have a predefined size then remove the weight and set some height to your recycler view
<android.support.v7.widget.RecyclerView
android:id="@+id/comment_recycler_view"
android:layout_width="match_parent"
android:layout_height="50dp"
android:animateLayoutChanges="false"
android:scrollbars="vertical" />
OR Use appropriate weights for proper height distribution with a LinearLayout as parent. That should fix it.
回答2:
The combination android:layout_weight="1"
and android:layout_height="0dp"
works only inside a linear layout. If you want to use weight attribute, put your recycler inside a LinearLayout or set a custom height instead. Basically your problem is that your recycler height is "0dp"
回答3:
Wherever you add layout_weight attribute set width or height to 0dp respectively. Also assign weigths to other elements giving weight to one element only is not a good practice they will cover the whole layout.
来源:https://stackoverflow.com/questions/42929053/recycleview-not-showing-in-dialogue-fragment