【问题标题】:RecyclerView Adapter (firebase) with cardview not showing没有显示卡片视图的 RecyclerView 适配器(firebase)
【发布时间】:2018-01-26 22:12:18
【问题描述】:

我尝试调整一个简单的适配器来填充我的回收卡视图。我首先将 firebase 数据保存到一个 ArrayList 中,然后将其转移到一个虚拟类(以保存变量)。但是,当我运行该应用程序时,它说

Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference...at 
ArrayRecyclerAdapter.getItemCount(ArrayRecyclerAdapter.java:26)

我测试以确保它通过添加行正确地从 GlobalData 保存/检索

test = ((GlobalData) getActivity().getApplication()).getMachineData();

所以我认为适配器有问题,但我不知道它是什么。 谢谢

card.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:padding="16dp"
>

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/cv"
    >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="16dp"
        >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/machine_name"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_marginRight="16dp"
            android:textSize="30sp"
            />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/machine_info"
            android:layout_below="@+id/machine_name"
            />

    </RelativeLayout>

</android.support.v7.widget.CardView>

</LinearLayout>

主.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<TextView
    android:id="@+id/machinie_title"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="16dp"
    android:text="@string/bar_machine"
    android:textAlignment="center"
    android:textSize="50sp" />

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="vertical"/>
</RelativeLayout>



</LinearLayout>

适配器.java

public class ArrayRecyclerAdapter extends 
RecyclerView.Adapter<ArrayRecyclerAdapter.mViewHolder> {

private ArrayList<MachineClass> machineClassList;

public ArrayRecyclerAdapter(ArrayList<MachineClass> mList) {
    this.machineClassList = mList;
}


@Override
public int getItemCount() {
    return machineClassList.size();
}

@Override
public void onBindViewHolder(mViewHolder mViewHolder, int i) {
    MachineClass ci = machineClassList.get(i);
    mViewHolder.vName.setText(ci.getmNAME());
    mViewHolder.vSurname.setText(ci.getmSTATUS());

}

@Override
public mViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View itemView = LayoutInflater.
            from(viewGroup.getContext()).
            inflate(R.layout.machine_card, viewGroup, false);

    return new mViewHolder(itemView);
}

public static class mViewHolder extends RecyclerView.ViewHolder {

    protected TextView vName;
    protected TextView vSurname;


    public mViewHolder(View v) {
        super(v);
        vName =  (TextView) v.findViewById(R.id.machine_name);
        vSurname = (TextView)  v.findViewById(R.id.machine_info);

    }
}
}

main.java

public class MachinePage extends Fragment {

public MachinePage() {
    // Required empty public constructor
}


public static MachinePage newInstance() {
    MachinePage fragment = new MachinePage();

    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View rootView = inflater.inflate(R.layout.fragment_machine_page, container, false);
    RecyclerView recyclerView = (RecyclerView)rootView.findViewById(R.id.recycler_view);
    recyclerView.setHasFixedSize(true);
    LinearLayoutManager llm = new LinearLayoutManager(getContext());
    recyclerView.setLayoutManager(llm);

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    final DatabaseReference myRef = database.getReference("RESOURCES/MACHINES");


    final ArrayList<MachineClass> machineList = new ArrayList<>();
    ArrayList<MachineClass> test;

    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot mchlist: dataSnapshot.getChildren()){
                MachineClass mach = mchlist.getValue(MachineClass.class);
                machineList.add(mach);
            }

            ((GlobalData) getActivity().getApplication()).setMachineData(machineList);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    test = ((GlobalData) getActivity().getApplication()).getMachineData();

    ArrayRecyclerAdapter adapter = new ArrayRecyclerAdapter(test);
    recyclerView.setAdapter(adapter);





    return rootView;
}

}

和 GlobalData.java

public class GlobalData extends Application {
//saves user ID globally + get user specific path
private String UserID;
private Tag UserTag;
private String UserPath;
private ArrayList<MachineClass> MachineData;

public String getUserID() {
    UserID = toHexString(UserTag.getId());
    return UserID;
}
public String getUserPath(){
    UserPath = "USERS/" + UserID + "/";
    return UserPath;
}

public void setUserTag(Tag tag) {
    this.UserTag = tag;
}

public static String toHexString(byte[] bytes) {
    char[] hexArray = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
    char[] hexChars = new char[bytes.length * 2];
    int v;
    for (int j = 0; j < bytes.length; j++) {
        v = bytes[j] & 0xFF;
        hexChars[j * 2] = hexArray[v / 16];
        hexChars[j * 2 + 1] = hexArray[v % 16];
    }
    return new String(hexChars);
}
//end of save user ID


public ArrayList<MachineClass> getMachineData() {
    return MachineData;
}

public ArrayList setMachineData(ArrayList<MachineClass> machineData) {
   return MachineData = machineData;
}
}

【问题讨论】:

    标签: android firebase firebase-realtime-database android-recyclerview android-cardview


    【解决方案1】:

    尝试这样做。像这样先初始化测试

    List<MachineClass> test = new ArrayList<>();
    

    然后,在为测试赋值时执行此操作。

    test.addAll(((GlobalData) getActivity().getApplication()).getMachineData());
    

    【讨论】:

    • 试过了。再次是它的空指针。但我不知道为什么会导致它。
    【解决方案2】:

    您应该检查,如果 getItemCount() 中的 Arraylist 为 null,如果 null 返回 0,则您传递的是 null ArrayList,检查您的 Fragment 中是否正确填写了 Arraylist

    @Override
    public int getItemCount() {
        if(machineClassList == null){return 0;} 
        return machineClassList.size();
    
    }
    

    【讨论】:

    • 我试过了。它不会崩溃,但仍然不显示任何内容
    • 是的,因为您将空列表传递给适配器,您的列表未填充...
    • 编辑。它确实崩溃了。抱歉,我没有连接到互联网(我知道这很愚蠢),但它是一个空列表
    • 添加前初始化测试arraylist,ArrayList test = new ArrayList();
    • 是的,我做到了。什么都没有。
    【解决方案3】:

    我设法解决了这个问题(尽管它的显示方式存在一些问题)

    Firebase Value Event Listener

    这基本上是说在 onDataChanged 函数中设置适配器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多