获取密钥时如何修复Firebase中的空指针?

时间:2019-01-23 08:20:54

标签: java android firebase

我遇到了一个错误,因为没有从firebase中获取数据,我不知道为什么,但是我尝试将密钥设置为我的modeldata。当我尝试将其放在Recycleview上时。尝试获取数据时出现错误。 看看我的代码。

ListActivity

public class ListActivity extends BaseActivity {

    private DatabaseReference databaseReference;
    private RecyclerView labelRecycleView;
    private ArrayList<DataFirebase> listLabel;
    private listAdapter listAdapter;
    private Button bInput;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);
        findView();
        setDataToList();
        initListener();
        putLayoutManager();
    }

    private void setDataToList() {
        simpleway.progressDialog(ListActivity.this);
        databaseReference.child("Username").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                listLabel = new ArrayList<>();
                for (DataSnapshot dataSnap : dataSnapshot.getChildren()) {

                    DataFirebase modelClass = dataSnap.getValue(DataFirebase.class);
                    modelClass.setLabel(dataSnap.getKey());
                    listLabel.add(modelClass);
                }
                listAdapter = new listAdapter(listLabel, ListActivity.this);
                labelRecycleView.setAdapter(listAdapter);
                simpleway.stopProgressDialog();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                System.out.println(databaseError.getDetails() + " " + databaseError.getMessage());
                simpleway.stopProgressDialog();
            }
        });
    }

    private void putLayoutManager() {
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
        labelRecycleView.setLayoutManager(layoutManager);
        labelRecycleView.setItemAnimator(new DefaultItemAnimator());
    }

    @Override
    public void findView() {
        databaseReference = FirebaseDatabase.getInstance().getReference();
        labelRecycleView = findViewById(R.id.listRecyclerVIew);
        bInput = findViewById(R.id.inputData);
    }


    @Override
    public void initListener() {
        bInput.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                simpleway.startnextActivity(ListActivity.this, InputActivity.class);
            }
        });
    }

    }

这是我的适配器,它表明我无法从标签中获取数据。

ListAdapter

public class listAdapter extends RecyclerView.Adapter<listAdapter.ViewHolder> {

    private List<DataFirebase> dataList;
    private AppCompatActivity someActivity;

    public listAdapter(List<DataFirebase> dataFirebases, AppCompatActivity someActivity) {
        this.dataList = dataFirebases;
        this.someActivity = someActivity;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.item_label, viewGroup, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
        final DataFirebase labelList = dataList.get(i);

        viewHolder.textLabel.setText(labelList.getLabel());

        viewHolder.linearLabel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                someActivity.getSupportFragmentManager()
                        .beginTransaction()
                        .setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_right)
                        .replace(R.id.container_layout, new TitleFragment())
                        .commit();
            }
        });
    }


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

    public class ViewHolder extends RecyclerView.ViewHolder {
        public LinearLayout linearLabel;
        public TextView textLabel;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            textLabel = itemView.findViewById(R.id.text_label);
            linearLabel = itemView.findViewById(R.id.linearLabel);
        }
    }

}

在我第二次尝试安装之前,它非常好。数据显示正常,但第二次尝试安装时出现此错误。

    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
     at com.example.parzival.flashcard.adapter.listAdapter.onBindViewHolder(listAdapter.java:45)
        at com.example.parzival.flashcard.adapter.listAdapter.onBindViewHolder(listAdapter.java:23)
        at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781)
        at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823)

我该如何解决?

2 个答案:

答案 0 :(得分:0)

通过堆栈跟踪,您的textview为空。

textLabel = itemView.findViewById(R.id.text_label); linearLabel = itemView.findViewById(R.id.linearLabel);

确保您的text_label / linearLabel ID属于R.layout.item_label。

答案 1 :(得分:0)

请显示您的数据结构

将此添加到您的代码中:

if (modelClass != null){
modelClass.setLabel(dataSnap.getKey());
}