首页 > 解决方案 > Groupie 适配器中的 SetOnItemClickListener 不起作用

问题描述

我使用 groupie lib 来显示我从 firebase 数据库中获取的项目。但是当我想在 Groupie 适配器中执行 setOnItemClickListener 时,什么也没有发生

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("/users");
    ref.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            adapter = new GroupAdapter();

            for (DataSnapshot ds:dataSnapshot.getChildren()) {
                Userinfo user = ds.getValue(Userinfo.class);
                if(user !=null)
                adapter.add(new ContactItem(user));
            }

            newmessage_recyclerview.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
            newmessage_recyclerview.addItemDecoration(new DividerItemDecoration(getApplicationContext(),DividerItemDecoration.VERTICAL));
            newmessage_recyclerview.setAdapter(adapter);

            adapter.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(@NonNull Item item, @NonNull View view) {
                    Log.d("main", String.valueOf(item.getId()));
                }
            });

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

标签: androidfirebaseandroid-recyclerview

解决方案


您的适配器和列表视图应该在外部进行初始化和分配onDataChange() method,如您所见,每次您从 firebase 数据库更改的数据时,适配器都会更改并且列表视图会重复设置,这是多余的。尝试这个。

//set up adapter and listview one time only
adapter = new GroupAdapter();
newmessage_recyclerview.setLayoutManager(new 
LinearLayoutManager(getApplicationContext()));
newmessage_recyclerview.addItemDecoration(new 
DividerItemDecoration(getApplicationContext(),DividerItemDecoration.VERTICAL));
newmessage_recyclerview.setAdapter(adapter);

adapter.setOnItemClickListener(new OnItemClickListener() {
     @Override
     public void onItemClick(@NonNull Item item, @NonNull View view) {
          Log.d("main", String.valueOf(item.getId()));
     }
});

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("/users");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

          for (DataSnapshot ds:dataSnapshot.getChildren()) {
               Userinfo user = ds.getValue(Userinfo.class);
               if(user !=null)
               adapter.add(new ContactItem(user));
               adapter.notifyDataSetChanged();
          }
      }

      @Override
      public void onCancelled(@NonNull DatabaseError databaseError) {

      }
 });

推荐阅读