Recyclerview는 Adapter 메서드를 호출하지 않습니다. : onCreateViewHolder, onBindViewHolder,
내 RecyclerView는 onCreateViewHolder를 호출하지 않으므로 onBindViewHolder는 recyclerview에 아무것도 나타나지 않습니다. 디버깅을 위해 로그를 넣었는데 로그가 표시되지 않습니다. 무엇을 할 수 있습니까?
내 어댑터 :
public class CommentListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private static final int EMPTY_VIEW = 10 ;
private ArrayList<comment> mItems;
Boolean firstTime = true;
private Typeface mTf = null;
Context mContext;
public CommentListAdapter(Context context,ArrayList<comment> items){
Log.e("Adapter", "constructor Called");
this.mItems = items;
mContext = context;
}
public class EmptyViewHolder extends RecyclerView.ViewHolder {
public EmptyViewHolder(View itemView) {
super(itemView);
}
}
public class ViewHolder extends RecyclerView.ViewHolder{
TextView mAuthorName;
TextView mMessage;
NetworkImageView mThumbnail;
public ViewHolder(View itemView) {
super(itemView);
mAuthorName = (TextView)itemView.findViewById(R.id.author_name);
mMessage = (TextView)itemView.findViewById(R.id.message);
mThumbnail = (NetworkImageView)itemView.findViewById(R.id.author_avatar);
}
}
public void add(comment item, int position) {
mItems.add(position, item);
notifyItemInserted(position);
}
public void remove(comment item) {
int position = mItems.indexOf(item);
mItems.remove(position);
notifyItemRemoved(position);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
Log.e("Adapter", "onCreateViewHolder Called");
View v;
if(firstTime){
mTf = BBcTypeFace.getTypeFace(parent.getContext().getApplicationContext(),"font/bbc.ttf");
firstTime = false;
}
if( viewType == EMPTY_VIEW){
v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.comment_empty_row,parent,false);
EmptyViewHolder evh = new EmptyViewHolder(v);
return evh;
}else {
v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.comment_row, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
Log.e("Adapter", "onBindViewHolder Called");
if(viewHolder instanceof ViewHolder) {
ViewHolder holder = (ViewHolder)viewHolder;
comment c = mItems.get(position);
Log.e("Adapter", "Comment is\n: " + c.toString());
final ViewHolder finalHolder = holder;
ImageRequest request = new ImageRequest(c.author_img_link, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
if (bitmap != null) {
finalHolder.mThumbnail.setImageBitmap(bitmap);
}
}
}, 0, 0, null,
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
VolleyLog.e("ImageLoader", volleyError.getMessage());
VolleyLog.e("ImageLoader", volleyError.getStackTrace());
}
});
GetVideoInfo.getInstance(mContext.getApplicationContext()).addToRequestQueue(request);
holder.mAuthorName.setText(c.author_name);
holder.mMessage.setText(c.Message);
holder.mMessage.setTypeface(mTf);
holder.mAuthorName.setTypeface(mTf);
}
}
@Override
public int getItemCount() {
Log.e("Adapter", "getItemCount() Called");
return (mItems.size() > 0 ? mItems.size() : 1);
}
@Override
public int getItemViewType(int position) {
Log.e("Adapter", "getItemViewType() Called");
if (mItems.size() == 0) {
return EMPTY_VIEW;
}
return super.getItemViewType(position);
}}
public void add(comment item, int position){...}
RecyclerView에 항목을 추가 하는 데 사용할 것 입니다.
조각에서 :
private RecyclerView mRecyclerView;
private CommentListAdapter mAdapter;
private LayoutManager mLayoutManager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_item_detail, container, false);
....
mLayoutManager = new LinearLayoutManager(getActivity());
mAdapter = new CommentListAdapter(getActivity(),new ArrayList<comment>());
mRecyclerView = (RecyclerView)rootView.findViewById(R.id.comment_list);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
makeJsonObjectRequest(mItem.url);
return rootView;
}
XML 파일 :
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/scrollView"
android:background="@android:color/white"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true">
....
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
.....
<android.support.v7.widget.RecyclerView
android:id="@+id/comment_list"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
....
</RelativeLayout>
....
</ScrollView>
comment_row xml 파일 :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="horizontal"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:gravity="right"
android:background="@android:color/darker_gray">
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="right">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/author_name"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@+id/author_avatar"
android:layout_toStartOf="@+id/author_avatar"
android:gravity="right" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/message"
android:layout_below="@+id/author_name"
android:layout_toLeftOf="@+id/author_avatar"
android:layout_toStartOf="@+id/author_avatar"
android:gravity="right" />
</LinearLayout>
<com.android.volley.toolbox.NetworkImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/author_avatar"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:minHeight="150dp"
android:minWidth="150dp" /></LinearLayout>
이 코드를 사용하여 RecyclerView에 항목을 추가하겠습니다.
JsonObjectRequest jsonObjReqComment = new
JsonObjectRequest(Request.Method.GET,urlJsonObj+"#comment", null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray res = response.getJSONArray("response");
//Log.e("Comment","Count:"+response.toString());
//Log.e("Comment","Count:"+res.length());
for (int i = 0; i < res.length(); i++) {
JSONObject thread = res.getJSONObject(i);
JSONObject author_json = thread.getJSONObject("author");
int dislikes = thread.getInt("dislikes");
int likes = thread.getInt("likes");
String Message = thread.getString("message");
//get Author info
String author_img_link = author_json.getJSONObject("avatar").getString("permalink");
String author_name = author_json.getString("name");
comment c = new comment(dislikes,likes,Message,author_img_link,author_name);
//Log.e("Comment",c.toString());
//commentsList.add(c);
mAdapter.add(c,0);
}
} catch (JSONException e) {
Log.e("OnResponse","Error JSON");
e.printStackTrace();
} catch (Exception e){
Log.e("OnResponse","Error Exception");
e.printStackTrace();
}
}
}
, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d("vOLLEY", "Error: " + error.getMessage());
// hide the progress dialog
}
}
){
@Override
public Map<String, String> getHeaders(){
Map<String, String> headers = new HashMap<String, String>();
headers.put("User-agent", "Comment");
return headers;
}
};
@yigit 이 ScrollView
, 의 조합을 추측 RelativeLayout
하면이 문제가 발생하므로 RecyclerView
.
@SanatiSharif와 @sohrab의 답변 외에 아래의 필수 단계를 따라야합니다.
setLayoutManager
다음과 같이으로 전화하십시오 .
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
before setting adapter into recyclerView, otherwise it is not going to work. You can customize it if you need. this link will give you some idea of how LayoutManager works.
If RecyclerView gets put into a ScrollView, then during measure step its height is unspecified (because ScrollView allows any height) and gets equal to minimum height (as per implementation) which is apparently zero.
ref : android: RecyclerView inside a ScrollView
Solution : - put views in row of RecyclerViews - Calculate the size of the list items and set the height of the ListView programmatically http://vardhan-justlikethat.blogspot.com/2014/04/android-listview-inside-scrollview.html
Might have been a different case but for me I just forgot to set the Layout Manager as follows:
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
recycler.setLayoutManager(layoutManager);
Hope it helps :)
Its late but hope it will help somone. try either of the following:
first solution: make sure you haven't use this line unnecessarily
recyclerView.setHasFixedSize(true);
second solution: make sure you set layout manager to recyclerView
recycler.setLayoutManager(new LinearLayoutManager(this));
third solution: you getItemCount
returns 0, So RecyclerView
never tries to instantiate a view. Make it return something greater than 0
In my Case I was using Fragment-> ViewPager and Tablayout -> Inside viewpagers item I used RecyclerView.
So Instead of calling ViewPagerAdapter(getChildFragmentManager()) , I was calling ViewPagerAdapter(getSupportFragmentManager()) , that is why any of my recycler adapter item is not getting called.
So proper way to set the ViewPagerAdapter within a fragment is
ViewPagerAdapter(getChildFragmentManager())
In my case i had this structure
<ScrollView>
<RelativeLayout>
<android.support.v7.widget.RecyclerView/>
</RelativeLayout>
</ScrollView>
i solved the problem remove Relative
<ScrollView>
<android.support.v7.widget.RecyclerView/>
</ScrollView>
Is kind of silly, but another thing that can block the calls to the methods is to declare the visibility of the view as GONE.
android:visibility="gone"
recyclerView.setVisibility(View.GONE);
Any of these will block the call of the methods in RecyclerView.Adapter
I hope it can help someone.
ReferenceURL : https://stackoverflow.com/questions/28115553/recyclerview-not-call-any-adapter-method-oncreateviewholder-onbindviewholder
'programing' 카테고리의 다른 글
우분투에서 기본 Python 버전을 python3으로 설정할 수 없습니다. (0) | 2020.12.26 |
---|---|
Netbeans에서 Tomcat 시작 실패 (0) | 2020.12.26 |
NSString에서 하위 문자열의 발생 횟수? (0) | 2020.12.26 |
산술 연산자를 사용하여 0과 1 사이를 뒤집을 수 있습니까? (0) | 2020.12.26 |
주어진 문자열이 회문인지 확인하는 방법은 무엇입니까? (0) | 2020.12.26 |