【问题标题】:Android Studio: Firestore: RecyclerView not displayed and errorAndroid Studio:Firestore:RecyclerView 未显示和错误
【发布时间】:2020-05-12 13:29:03
【问题描述】:

感谢您的光临。所以我的问题是,我通过 Youtube 的 CodingInFlow 尝试了一些教程。我密切关注,但这里有一个错误。我认为是由于 AndroidX 的更新或其他原因。所以问题是无法编译 onClick 方法(计划是单击并查看 entreis 的详细信息),其他一切正常,我可以将日期保存到 firestore。

希望有人可以帮助我...谢谢!!!!

我使用的是 Android Studio 3.6.3、Gradle 6.4

错误片段

在 AdapterJava 文件中

itemView.setOnClickListener(new View.OnClickListener() {
           @Override
          public void onClick(View v) {
               int position = getBindingAdapterPosition ();
                DocumentSnapshot documentSnapshot = getSnapshots().getSnapshot(position);
                if ((position != RecyclerView .NO_POSITION) && listener != null) {
                    listener.onItemClick(getSnapshots().getSnapshot(position),position);

                }
            }
        });

Here's the error.

下面的完整代码:如果需要 适配器 Java 文件

public class AddEntryAdapter extends FirestoreRecyclerAdapter<Entry, AddEntryAdapter.EntryHolder>{

    private AdapterView.OnItemClickListener listener;

    public AddEntryAdapter(@NonNull FirestoreRecyclerOptions<Entry> options) {
        super(options);
    }

    @Override
    protected void onBindViewHolder(@NonNull EntryHolder holder, int position, @NonNull Entry model) {
        holder.textViewTitle.setText(model.getTitle());
        holder.textViewDescription.setText(model.getDescription());
        holder.textViewPriority.setText(String.valueOf(model.getPriority()));

    }

    @NonNull
    @Override
    public EntryHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.entry_item,
                parent, false);
        return new EntryHolder(v);
    }

    public void deleteItem(int position) {
        getSnapshots().getSnapshot(position).getReference().delete();
    }

    class EntryHolder extends RecyclerView.ViewHolder {
        TextView textViewTitle;
        TextView textViewDescription;
        TextView textViewPriority;

        public EntryHolder(View itemView) {
            super(itemView);
            textViewTitle = itemView.findViewById(R.id.text_view_title);
            textViewDescription = itemView.findViewById(R.id.text_view_description);
            textViewPriority = itemView.findViewById(R.id.text_view_priority);

            itemView.setOnClickListener(new View.OnClickListener() {
               @Override
              public void onClick(View v) {
                   int position = getBindingAdapterPosition ();
                    DocumentSnapshot documentSnapshot = getSnapshots().getSnapshot(position);
                    if ((position != RecyclerView .NO_POSITION) && listener != null) {
                        listener.onItemClick(getSnapshots().getSnapshot(position),position);

                    }
                }
            });
        }
    }

    public interface OnItemClickListener {
        void onItemClick(DocumentSnapshot documentSnapshot, int position);
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        this.listener = (AdapterView.OnItemClickListener) listener;
    }
}

Activity 显示 RecyclerView,用户可以点击卡片查看条目的详细信息。 这里还有底部导航栏的代码,不知道是不是崩溃的原因。

public class PastEntriesActivity extends AppCompatActivity {
    private FirebaseFirestore db = FirebaseFirestore.getInstance();
    private CollectionReference notebookRef = db.collection("UserEntries");

    private AddEntryAdapter adapter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pastentries);

        BottomNavigationView bottomNavigationView = (BottomNavigationView) 
    findViewById(R.id.bottomNavView_Bar);
        BottomNavigationViewHelper.removeNavigationShiftMode(bottomNavigationView);
        Menu menu = bottomNavigationView.getMenu();
        MenuItem menuItem = menu.getItem(3);
        menuItem.setChecked(true);

        setUpRecyclerView();

    bottomNavigationView.setOnNavigationItemSelectedListener(new 
    BottomNavigationView.OnNavigationItemSelectedListener() {

            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()){
                    case R.id.ic_main:
                        Intent intent0 = new Intent(PastEntriesActivity.this, MainActivity.class);
                        startActivity(intent0);
                        break;

                    case R.id.ic_search:
                        Intent intent1 = new Intent(PastEntriesActivity.this, SearchActivity.class);
                        startActivity(intent1);
                        break;

                    case R.id.ic_add_entries:
                        Intent intent2 = new Intent(PastEntriesActivity.this, PastEntriesActivity.class);
                        startActivity(intent2);
                        break;

                    case R.id.ic_past_entries:
                        break;

                    case R.id.ic_profile:
                        Intent intent4 = new Intent(PastEntriesActivity.this, ProfileActivity.class);
                        startActivity(intent4);
                        break;
                }


                return false;
            }
        });
    }

    private void setUpRecyclerView() {
        Query query = notebookRef.orderBy("priority", Query.Direction.DESCENDING);

        FirestoreRecyclerOptions<Entry> options = new FirestoreRecyclerOptions.Builder<Entry>()
                .setQuery(query, Entry.class)
                .build();

        adapter = new AddEntryAdapter(options);

        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);

        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
                ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
                adapter.deleteItem(viewHolder.getBindingAdapterPosition());
            }
        }).attachToRecyclerView(recyclerView);

        adapter.setOnItemClickListener(new AddEntryAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(DocumentSnapshot documentSnapshot, int position) {
               Entry entry = documentSnapshot.toObject(Entry.class);
                String id = documentSnapshot.getId();
               String path = documentSnapshot.getReference().getPath();
                Toast.makeText(PastEntriesActivity.this,
                        "Position: " + position + " ID: " + id, Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        adapter.startListening();
    }

    @Override
    protected void onStop() {
        super.onStop();
        adapter.stopListening();
    }
}

【问题讨论】:

    标签: java android firebase android-recyclerview google-cloud-firestore


    【解决方案1】:

    我的猜测是你使用了错误的 OnItemClickListener 接口;

    private AdapterView.OnItemClickListener listener;
    

    在这行代码中,您将侦听器定义为已在 AdapterView 类中定义的接口。此接口不接受与您在自己的类中定义的自定义接口相同的参数。这可能是某些 IDE 自动完成或其他原因的结果。

    private OnItemClickListener listener;
    

    【讨论】:

      猜你喜欢
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 2020-12-04
      相关资源
      最近更新 更多