我在Android Studio的Android版本23项目中使用RecyclerView
,CardView
,Fragment
和AsyncTask
。我试图在三星Galaxy S7上调试应用程序。无论我似乎以编码方式尝试,我的onCreateViewHolder
实现类的onBindViewHolder
和RecyclerView.Adapter
方法都不会被调用。
的活动:
public class RecyclerViewFragmentActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.todays_visit_list_container);
if (savedInstanceState == null) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
RecyclerViewFragment fragment = new RecyclerViewFragment();
transaction.replace(R.id.sample_content_fragment, fragment);
transaction.commit();
}
}
}
片段:
public class RecyclerViewFragment extends Fragment {
protected RecyclerView mRecyclerView;
protected RecyclerView.LayoutManager mLayoutManager;
protected RecyclerViewAdapter mAdapter;
protected ListRefresher aListRefresher;
protected class ListRefresher extends AsyncTask<Uri, Void, Void> {
private ArrayList<Probationer> probationers = null;
RecyclerViewFragment fragment = null;
public ListRefresher(RecyclerViewFragment fragment) {
this.fragment = fragment;
}
@Override
protected Void doInBackground(Uri... params) {
ArrayList<Probationer> probationers = new ArrayList<Probationer>();
// getData makes a JSON call to retrieve data for RecyclerView Adapter
listobjects = getData();
return null;
}
@Override
protected void onPostExecute(Void unused) {
fragment.onTaskCompleted();
}
public ArrayList getItems() {
return probationers;
}
}
protected void onTaskCompleted() {
PPOTodaysVisitListAdapter adapter = new PPOTodaysVisitListAdapter(getActivity(), aListRefresher.getItems());
mRecyclerView.setAdapter(adapter);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.todays_visit_list, container, false);
mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);
LinearLayoutManager llm = new LinearLayoutManager(getActivity());
llm.setOrientation(LinearLayoutManager.VERTICAL);
llm.scrollToPosition(0);
mRecyclerView.setLayoutManager(llm);
mRecyclerView.setHasFixedSize(true);
aListRefresher = new ListRefresher(this);
aListRefresher.execute();
return rootView;
}
}
适配器:
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {
private ArrayList<Probationer> probationers;
Context context;
public RecyclerViewAdapter(Context context, ArrayList<Probationer> probationers) {
this.probationers = probationers;
this.context = context;
}
public static class MyViewHolder extends RecyclerView.ViewHolder {
public CardView cv;
public TextView supervisionLevel;
public TextView popCodes;
public TextView unavailable;
public TextView offenderId;
public TextView name;
public TextView birthDate;
public TextView addressLine1;
public TextView addressLine2;
public TextView lastDrugScreen;
public TextView lastDrugScreenResultNeg;
public TextView lastDrugScreenResultPos;
public TextView mainCrime;
public TextView lastDate1Lbl;
public TextView lastDate2Lbl;
public TextView lastDate3Lbl;
public TextView lastDate4Lbl;
public TextView lastDate1;
public TextView nextDate1;
public TextView lastDate2;
public TextView nextDate2;
public TextView lastDate3;
public TextView nextDate3;
public TextView lastDate4;
public TextView nextDate4;
MyViewHolder(View itemView) {
super(itemView);
cv = (CardView) itemView.findViewById(R.id.cardView);
supervisionLevel = (TextView) itemView.findViewById(R.id.supervisionLevel);
unavailable = (TextView) itemView.findViewById(R.id.unavailable);
popCodes = (TextView) itemView.findViewById(R.id.popCodes);
.
.
.
}
}
@Override
public RecyclerViewAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//Inflate the layout, initialize the View Holder
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.todays_visit_list_item, parent, false);
RecyclerViewAdapter.MyViewHolder holder = new RecyclerViewAdapter.MyViewHolder(v);
return holder;
}
@Override
public void onBindViewHolder(RecyclerViewAdapter.MyViewHolder viewHolder, final int position) {
if (probationers != null && probationers.size() > 0) {
Probationer aProbationer = probationers.get(position);
if (aProbationer != null) {
viewHolder.offenderId.setText(aProbationer.getProbationerId());
viewHolder.name.setText(aProbationer.getName());
viewHolder.birthDate.setText(aProbationer.getDateOfBirth());
viewHolder.supervisionLevel.setText(aProbationer.getSupervisionLevel());
viewHolder.unavailable.setText(aProbationer.getUnavailable());
.
.
.
}
}
@Override
public int getItemCount() {
return probationers.size();
}
}
RecyclerView布局(todays_visit_list.xml):
<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">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
CardView布局(todays_visit_list_item.xml):
<android.support.v7.widget.CardView
android:id="@+id/cardView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/activity_vertical_margin"
app:cardCornerRadius="@dimen/activity_vertical_margin"
app:cardElevation="@dimen/activity_vertical_margin"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:id="@+id/photolayout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="72dip"
android:layout_height="100dip"
android:layout_marginTop="6dip">
<ImageView
android:id="@+id/loadingphoto"
android:scaleType="fitEnd"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/nopicture"/>
<ImageView
android:id="@+id/photo"
android:scaleType="fitEnd"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="gone"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/supmsglayout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="72dip"
android:layout_height="20dip"
android:layout_marginTop="6dip"
android:layout_below="@id/photolayout"
android:layout_alignLeft="@id/photolayout">
<TextView android:id="@+id/supervisionLevel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="6dip"
android:layout_marginLeft="2dip"
android:textSize="11sp"
android:textStyle="bold"/>
<TextView android:id="@+id/unavailable"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="11sp"
android:textStyle="bold"
android:layout_toRightOf="@id/supervisionLevel"
android:layout_alignTop="@id/supervisionLevel"/>
<TextView android:id="@+id/popCodes"
android:layout_width="76dip"
android:layout_height="wrap_content"
android:layout_marginTop="2dip"
android:textSize="11sp"
android:textColor="#E79A00"
android:textStyle="bold"
android:layout_below="@id/supervisionLevel"
android:layout_alignLeft="@id/supervisionLevel"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/contentlayout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="300dip"
android:layout_height="100dip"
android:layout_marginTop="8dip"
android:layout_marginLeft="4dip"
android:layout_toRightOf="@id/photolayout"
android:layout_alignTop="@id/photolayout">
<TextView android:id="@+id/offenderIdLbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Offender ID: "
android:textStyle="bold"
android:textSize="11sp"/>
<TextView android:id="@+id/offenderId"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="11sp"
android:layout_toRightOf="@id/offenderIdLbl"
android:layout_alignTop="@id/offenderIdLbl"/>
<TextView android:id="@+id/nameLbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Name: "
android:textStyle="bold"
android:textSize="11sp"
android:layout_below="@id/offenderIdLbl"
android:layout_alignLeft="@id/offenderIdLbl"/>
<TextView android:id="@+id/name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="11sp"
android:layout_toRightOf="@id/nameLbl"
android:layout_alignTop="@id/nameLbl"/>
<TextView android:id="@+id/birthDateLbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Birth Date: "
android:textStyle="bold"
android:textSize="11sp"
android:layout_below="@id/nameLbl"
android:layout_alignLeft="@id/nameLbl"/>
<TextView android:id="@+id/birthDate"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="11sp"
android:layout_toRightOf="@id/birthDateLbl"
android:layout_alignTop="@id/birthDateLbl"/>
<TextView android:id="@+id/addrLbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Address: "
android:textStyle="bold"
android:textSize="11sp"
android:layout_below="@id/birthDateLbl"
android:layout_alignLeft="@id/birthDateLbl"/>
<TextView
android:id="@+id/addressLine1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="11sp"
android:layout_toRightOf="@id/addrLbl"
android:layout_alignTop="@id/addrLbl"/>
<TextView
android:id="@+id/addressLine2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="11sp"
android:layout_below="@id/addressLine1"
android:layout_alignLeft="@id/addressLine1"/>
<TextView android:id="@+id/lastDrugScreenLbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Drug Scr: "
android:textStyle="bold"
android:textSize="11sp"
android:layout_below="@id/addressLine2"
android:layout_alignLeft="@id/addrLbl"/>
<TextView android:id="@+id/lastDrugScreen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="11sp"
android:layout_toRightOf="@id/lastDrugScreenLbl"
android:layout_alignTop="@id/lastDrugScreenLbl"/>
<TextView android:id="@+id/lastDrugScreenResultNeg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="11sp"
android:layout_toRightOf="@id/lastDrugScreen"
android:layout_alignTop="@id/lastDrugScreen"/>
<TextView android:id="@+id/lastDrugScreenResultPos"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="11sp"
android:textColor="#d7144b"
android:textStyle="bold"
android:layout_toRightOf="@id/lastDrugScreen"
android:layout_alignTop="@id/lastDrugScreen"/>
<TextView android:id="@+id/mainCrimeLbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Crime: "
android:textStyle="bold"
android:textSize="11sp"
android:layout_below="@id/lastDrugScreenLbl"
android:layout_alignLeft="@id/lastDrugScreenLbl"/>
<TextView android:id="@+id/mainCrime"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="11sp"
android:layout_toRightOf="@id/mainCrimeLbl"
android:layout_alignTop="@id/mainCrimeLbl"/>
<TextView android:id="@+id/lastDate1Lbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="33dip"
android:textStyle="bold"
android:textSize="11sp"
android:layout_below="@id/mainCrimeLbl"
android:layout_alignLeft="@id/mainCrimeLbl"/>
<TextView android:id="@+id/lastDate2Lbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="34dip"
android:textStyle="bold"
android:textSize="11sp"
android:layout_below="@id/mainCrimeLbl"
android:layout_toRightOf="@id/lastDate1Lbl"/>
<TextView android:id="@+id/lastDate3Lbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="86dip"
android:textStyle="bold"
android:textSize="11sp"
android:layout_below="@id/mainCrimeLbl"
android:layout_toRightOf="@id/lastDate1Lbl"/>
<TextView android:id="@+id/lastDate4Lbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="140dip"
android:textStyle="bold"
android:textSize="11sp"
android:layout_below="@id/mainCrimeLbl"
android:layout_toRightOf="@id/lastDate1Lbl"/>
<TextView android:id="@+id/lastLbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Last: "
android:textStyle="bold"
android:textSize="11sp"
android:layout_below="@id/lastDate1Lbl"
android:layout_alignLeft="@id/mainCrimeLbl"/>
<TextView android:id="@+id/nextLbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Next: "
android:textStyle="bold"
android:textSize="11sp"
android:layout_below="@id/lastLbl"
android:layout_alignLeft="@id/lastLbl"/>
<TextView android:id="@+id/lastDate1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="11sp"
android:layout_below="@id/lastDate1Lbl"
android:layout_alignLeft="@id/lastDate1Lbl"/>
<TextView android:id="@+id/nextDate1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="11sp"
android:layout_below="@id/lastDate1"
android:layout_alignLeft="@id/lastDate1"/>
<TextView android:id="@+id/lastDate2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="11sp"
android:layout_below="@id/lastDate2Lbl"
android:layout_alignLeft="@id/lastDate2Lbl"/>
<TextView android:id="@+id/nextDate2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="11sp"
android:layout_below="@id/lastDate2"
android:layout_alignLeft="@id/lastDate2"/>
<TextView android:id="@+id/lastDate3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="11sp"
android:layout_below="@id/lastDate3Lbl"
android:layout_alignLeft="@id/lastDate3Lbl"/>
<TextView android:id="@+id/nextDate3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="11sp"
android:layout_below="@id/lastDate3"
android:layout_alignLeft="@id/lastDate3"/>
<TextView android:id="@+id/lastDate4"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="11sp"
android:layout_below="@id/lastDate4Lbl"
android:layout_alignLeft="@id/lastDate4Lbl"/>
<TextView android:id="@+id/nextDate4"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="11sp"
android:layout_below="@id/lastDate4"
android:layout_alignLeft="@id/lastDate4"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/undolayout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="40dip"
android:layout_height="100dip"
android:layout_marginTop="8dip"
android:layout_marginLeft="4dip"
android:layout_toRightOf="@id/contentlayout"
android:layout_alignTop="@id/contentlayout">
<Button
android:id="@+id/undo_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_undo"
android:textAllCaps="true"
android:textColor="@android:color/white"
android:layout_gravity="end|center_vertical"
style="@style/Base.Widget.AppCompat.Button.Borderless"
/>
</RelativeLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
我的JSON调用正在返回数据,AsyncTask
正在回调Fragment
并执行方法onTaskCompleted()
。当我创建RecyclerViewAdapter
的实例时,ArrayList
包含项目。唯一的问题是RecyclerView
从不显示任何内容。 onCreateViewHolder
的{{1}}和onBindViewHolder
方法永远不会被调用。
我已经使用了两种布局的所有元素的RecyclerViewAdapter
和layout_width
,认为这导致了问题。我在实例化layout_height
之前以及在notifyDataSetChanged()
中设置RecyclerViewAdapter
之前,还故意调用了RecyclerView
。那里也没有快乐。
有没有人在这里看到任何可能导致RecyclerView
无法渲染的明显问题?
我也很好奇是什么实际触发了在适配器上调用这两种方法...如果我能弄明白,也许我可以确定为什么事件没有被触发。
答案 0 :(得分:2)
尝试在生命周期的早期将适配器设置为RecyclerView(onCreate是一个不错的选择),当完成AsyncTask时,只需通过notifyDataSetChanged()
另外,请确保设置LayoutManager,如下所示:
recycler.setLayoutManager(new LinearLayoutManager(this));
由于您的RecyclerView位于片段内,因此您的情况将是:
recycler.setLayoutManager(new LinearLayoutManager(getActivity()));
关于你的问题
我也很好奇究竟是什么触发了这两个人的召唤 适配器上的方法...如果我能弄清楚,也许我可以 确定事件未被触发的原因。
当渲染列表的时间到来时,它必须主要使用您的数据集大小。在你的情况下(一旦我的),缺少设置LayoutManager,不知何故,导致不渲染。
您已经在适配器中引用了上下文,可以尝试这样做:
@Override
public RecyclerViewAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(context).inflate(R.layout.todays_visit_list_item, parent, false); //
RecyclerViewAdapter.MyViewHolder holder = new RecyclerViewAdapter.MyViewHolder(v);
return holder;
}