RecylerView Adapter onCreateViewHolder& onBindViewHolder未调用:视图为空

时间:2016-08-16 19:54:12

标签: android android-asynctask

我在Android Studio的Android版本23项目中使用RecyclerViewCardViewFragmentAsyncTask。我试图在三星Galaxy S7上调试应用程序。无论我似乎以编码方式尝试,我的onCreateViewHolder实现类的onBindViewHolderRecyclerView.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方法永远不会被调用。

我已经使用了两种布局的所有元素的RecyclerViewAdapterlayout_width,认为这导致了问题。我在实例化layout_height之前以及在notifyDataSetChanged()中设置RecyclerViewAdapter之前,还故意调用了RecyclerView。那里也没有快乐。

有没有人在这里看到任何可能导致RecyclerView无法渲染的明显问题?

我也很好奇是什么实际触发了在适配器上调用这两种方法...如果我能弄明白,也许我可以确定为什么事件没有被触发。

1 个答案:

答案 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;    
    }