【问题标题】:FirebaseRecyclerAdapter working for API 21 but not working with oreo or nougatFirebaseRecyclerAdapter 适用于 API 21,但不适用于 oreo 或牛轧糖
【发布时间】:2018-11-08 00:24:22
【问题描述】:
public class AllUsersActivity extends AppCompatActivity {

private Toolbar mToolbar;
private RecyclerView mUserRecycler;

private DatabaseReference mAllUsersDatabase;
private DatabaseReference mUserRef;
private FirebaseAuth mAuth;
private FirebaseUser mCurrentUser;



FirebaseRecyclerAdapter<Users, AllUsersViewHolder> firebaseRecyclerAdapter;

@Override

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_all_users);

    mToolbar = (Toolbar) findViewById(R.id.users_app_bar);
    setSupportActionBar(mToolbar);
    getSupportActionBar().setTitle("All Users");
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    mAuth = FirebaseAuth.getInstance();
    mCurrentUser = mAuth.getCurrentUser();
    mUserRef = FirebaseDatabase.getInstance().getReference().child("Users").child(mAuth.getCurrentUser().getUid());

    mAllUsersDatabase = FirebaseDatabase.getInstance().getReference().child("Users");
    mAllUsersDatabase.keepSynced(true);
    Log.i(TAG, "Toolbar DOne");


    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    linearLayoutManager.setStackFromEnd(true);

    mUserRecycler = (RecyclerView) findViewById(R.id.allusers_recycler_view);
    mUserRecycler.setHasFixedSize(true);
    mUserRecycler.setLayoutManager(linearLayoutManager);


}


@Override
protected void onStart() {
    super.onStart();
    mUserRef.child("online").setValue("true");


    FirebaseRecyclerOptions personsOptions = new FirebaseRecyclerOptions.Builder<Users>()
            .setQuery(mAllUsersDatabase, Users.class).build();
    Log.i(TAG, "onStart - ");
    firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Users, AllUsersViewHolder>(personsOptions) {
        @NonNull
        @Override
        public AllUsersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.allusers_single, parent, false);
            Log.i(TAG, "Create VIewHolder ");

            return new AllUsersViewHolder(view);
        }

        @Override
        protected void onBindViewHolder(@NonNull AllUsersViewHolder holder, int position,
                                        @NonNull final Users model) {
            Log.i(TAG, "onBindVIewHolder - " + model.getName());
            holder.setDisplayName(model.getName());
            holder.setUserImage(model.getThumb_image(), getApplicationContext());

            final String user_id = getRef(position).getKey();
            holder.mView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent chat_intent = new Intent(AllUsersActivity.this, ChatActivity.class);
                    chat_intent.putExtra("user_id", user_id);
                    chat_intent.putExtra("user_name", model.getName());
                    startActivity(chat_intent);
                }
            });

        }
    };
    mUserRecycler.setAdapter(firebaseRecyclerAdapter);
    firebaseRecyclerAdapter.startListening();

}


@Override
public void onStop() {

    super.onStop();
    if (mCurrentUser != null) {
        mUserRef.child("online").setValue(ServerValue.TIMESTAMP);
    }
    firebaseRecyclerAdapter.stopListening();
}


public static class AllUsersViewHolder extends RecyclerView.ViewHolder {
    public View mView;


    public AllUsersViewHolder(View itemView) {
        super(itemView);
        mView = itemView;
    }

    public void setDisplayName(String a) {
        TextView userName = (TextView) mView.findViewById(R.id.allusers_name);
        userName.setText(a);
    }

    public void setUserImage(String thumb_image, Context ct) {
        CircleImageView userImageView = (CircleImageView) mView.findViewById(R.id.allusers_image);
        Picasso.get().load(thumb_image).placeholder(R.drawable.user).into(userImageView);
    }
}

问题是我从 Firebase 获取数据,并在 API 21 (即棒棒糖)中显示在屏幕上,但使用 oreo 和牛轧糖时,屏幕上没有加载任何内容,我可以在日志中看到数据。代码有什么问题?请帮忙。 我正在从 Firebase 检索所有用户的列表并使用 Firebase UI 数据库。使用 Firebase 16.0.0 资源链接 https://github.com/firebase/FirebaseUI-Android/tree/master/database

【问题讨论】:

  • 如果您不知道解决方案,请不要对问题投反对票。

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


【解决方案1】:

这适用于 android 7 只需查看我们的代码之间的差异并更改参数

 private RecyclerView usersList;

private DatabaseReference usersDatabase;

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

    getSupportActionBar().setTitle("Users List");
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    usersDatabase = FirebaseDatabase.getInstance().getReference().child("locations");

    usersList = findViewById(R.id.usersList);
    usersList.setHasFixedSize(true);
    usersList.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
    usersList.setLayoutManager(new LinearLayoutManager(this));
}

@Override
protected void onStart() {
    super.onStart();
    FirebaseRecyclerAdapter<Users, UsersViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Users, UsersViewHolder>(
            Users.class,
            R.layout.user_list,
            UsersViewHolder.class,
            usersDatabase
    ) {
        @Override
        protected void populateViewHolder(final UsersViewHolder usersViewHolder, Users users, final int position) {
            String str = getRef(position).getKey();
            String newName = str.replace(" ", ".");
            usersViewHolder.setDisplayName(newName);
            final String user_id = getRef(position).getKey();
            usersViewHolder.mView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, UserActivity.class);
                    intent.putExtra("user_id", user_id);
                    startActivity(intent);
                }
            });


        }
    };
    usersList.setAdapter(firebaseRecyclerAdapter);
}

@SuppressWarnings("WeakerAccess")
public static class UsersViewHolder extends RecyclerView.ViewHolder {

    View mView;

    public UsersViewHolder(View itemView) {
        super(itemView);
        mView = itemView;
    }

    public void setDisplayName(String name) {
        TextView userNameView = mView.findViewById(R.id.userName);
        userNameView.setText(name);
    }

    public void setDisplayStatus(String status) {
        TextView statusView = mView.findViewById(R.id.userStatus);
        if (status.equals("offline")) {
            statusView.setText("offline");
            statusView.setTextColor(Color.RED);
        } else {
            statusView.setText(status);
            statusView.setTextColor(Color.GREEN);
        }
    }
}

这是activity_main.xml

<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.mike.mapfirebasedisplay.MainActivity">

<android.support.v7.widget.RecyclerView
    android:id="@+id/usersList"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="5dp" />

这是您可以随意更改的用户列表.....!

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginEnd="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp">

<TextView
    android:id="@+id/userName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:text="@string/name"
    android:textColor="@android:color/black"
    android:textSize="18sp" />


</RelativeLayout>

【讨论】:

  • 我确信这适用于 Firebase 11.8 或更低版本,但之后不推荐使用 onPopulateViewHolder 并使用 onBindViewHolder。我使用的是 Firebase 16.0
  • 也许你应该在投反对票之前把你的 gradle 选项放在一边
  • 我没有否决您的回答。你否决了这个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
相关资源
最近更新 更多