【问题标题】:How to display the recent added data to the top of the recycler view [closed]如何在回收站视图顶部显示最近添加的数据[关闭]
【发布时间】:2020-02-17 18:18:43
【问题描述】:

我正在创建一个应用程序,我将数据存储到 firebase 并将其检索到我的 recycler 视图,但问题是,我想在 recycler 视图的顶部显示最新添加的数据。我正在尝试获取最新数据,但我已经完成了所有可能的解决方案,但我仍然没有得到。

请看下面的代码......

这是我的主类:

public class ShowDetails extends AppCompatActivity {

ProgressDialog progressDialog;
List<DataClass> list = new ArrayList<>();
RecyclerView recyclerView;
RecyclerView.Adapter adapter;

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

    recyclerView = findViewById(R.id.erecyclerView);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(ShowDetails.this));
    progressDialog = new ProgressDialog(ShowDetails.this);
    progressDialog.setMessage("Loading Data from Firebase Database");
    progressDialog.show();

    FirebaseOptions options = new FirebaseOptions.Builder()
            .setApplicationId("1:102738125513:android:3042292623f0448c") // Required for Analytics.
            .setApiKey("AIzaSyAZbWBpPzjAkrg23riK9kwk2T0tDf47dko") // Required for Auth.
            .setDatabaseUrl("https://citycare-fed31.firebaseio.com/") // Required for RTDB.
            .build();
    FirebaseApp.initializeApp(this);
            // Retrieve my other app.
            FirebaseApp app = FirebaseApp.getInstance("[DEFAULT]");
    // Get the database for the other app.
    FirebaseDatabase secondaryDatabase = FirebaseDatabase.getInstance(app);
    DatabaseReference data = secondaryDatabase.getInstance().getReference("Electricity");
    data.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for (DataSnapshot ds : dataSnapshot.getChildren()) {

                for (DataSnapshot dSnapshot : ds.getChildren()) {

                    DataClass DataClass = dSnapshot.getValue(DataClass.class);

                    Log.d("Show", DataClass.getEname() == null ? "" : DataClass.getEname());
                    list.add(DataClass);

                }
                adapter = new ShowDetails.DataAdapter(ShowDetails.this, list);
                recyclerView.setAdapter(adapter);
                adapter.notifyDataSetChanged();
                progressDialog.dismiss();
            }
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
            progressDialog.dismiss();
        }
    });

}

这是我的适配器类:

 private class DataAdapter extends RecyclerView.Adapter<ShowDetails.DataAdapter.ViewHolder>  {

    Context context;
    List<DataClass> listData;

    public DataAdapter(Context context, List<DataClass> list) {

        this.context = context;
        this.listData = list;
    }

    @Override
    public ShowDetails.DataAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.show_items, parent, false);
        ShowDetails.DataAdapter.ViewHolder viewHolder = new ShowDetails.DataAdapter.ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ShowDetails.DataAdapter.ViewHolder holder, int position) {

        final DataClass AllDetails = listData.get(position);
        holder.NameTextView.setText(AllDetails.getEname());
        holder.EmailTextView.setText(AllDetails.getEemail());
        holder.DateTextView.setText(AllDetails.getEdate());
        holder.LocationTextView.setText(AllDetails.getElocation());
        holder.TypeTextView.setText(AllDetails.getEtype());
        Picasso.with(context).load(AllDetails.getImgurl()).resize(120, 60).into(holder.ImageTextView);

        holder.ImageTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(ShowDetails.this, ShowImage.class);
                i.putExtra("img", AllDetails.getImgurl());
                startActivity(i);
            }
        });
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(ShowDetails.this, Email_Activity.class);
                i.putExtra("txt", AllDetails.getEemail());
                startActivity(i);
            }
        });
    }

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

    class ViewHolder extends RecyclerView.ViewHolder {

        public TextView NameTextView;
        public TextView EmailTextView;
        public TextView DateTextView;
        public TextView LocationTextView;
        public TextView TypeTextView;
        public ImageView ImageTextView;
        public ViewHolder(View itemView) {

            super(itemView);
            NameTextView = itemView.findViewById(R.id.ShowNameTextView);
            EmailTextView = itemView.findViewById(R.id.ShowEmailTextView);
            DateTextView = itemView.findViewById(R.id.ShowDateTextView);
            LocationTextView = itemView.findViewById(R.id.ShowLocationTextView);
            TypeTextView = itemView.findViewById(R.id.ShowTypeTextView);
            ImageTextView = itemView.findViewById(R.id.ShowImageView);
        }
    }
}

这是我的数据库

firebase data structure

这是我删除额外 for 循环后的 API 响应 API response

请帮帮我,我是编程新手

【问题讨论】:

  • 请发布数据库结构
  • 请分享您必须从数据库中检索的 API 响应。所以我们可以提供更好的帮助。

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


【解决方案1】:

您可以在循环中将数据添加到列表的第一个迭代器中, 并将 setadapter 移出循环:

for (DataSnapshot ds : dataSnapshot.getChildren()) {
   for (DataSnapshot dSnapshot : ds.getChildren()) {
      DataClass DataClass = dSnapshot.getValue(DataClass.class);
      list.add(0, DataClass);
   }
}
adapter = new ShowDetails.DataAdapter(ShowDetails.this, list);
recyclerView.setAdapter(adapter);
progressDialog.dismiss();

【讨论】:

  • 仍然无法正常工作..它随机显示所有数据
  • 为什么要使用 2 个循环?删除一个
  • 因为我的数据存储在子节点中,所以我必须从父节点迭代
  • 它将元素添加到父循环中每个迭代器的列表中,我认为有问题,也许你应该分享响应。
  • 请看我的数据库结构。如果我删除额外的 for 循环,它会使用空值检索回收器视图
【解决方案2】:

注意:如果您的回收站视图以相反的顺序显示数据..您可以使用以下方法。

如果满足以上条件,会按顺序显示

在回收站视图的布局管理器中

LinearLayoutManager lm = new LinearLayoutManager(mActivity, RecyclerView.VERTICAL, true);
recyclerView.setLayoutManager(lm);

这应该可以解决您的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 2021-10-01
    相关资源
    最近更新 更多