【问题标题】:How to show a firestore Collection in an Android ListView using an Adapter如何使用适配器在 Android ListView 中显示 Firestore 集合
【发布时间】:2018-04-04 20:07:54
【问题描述】:

我正在开发一个简单的应用程序,我需要在我的应用程序中查看特定 FirebaseFirestore 集合中的每个文档。

为了完成这项工作,我认为最好的解决方案是使用 ListView 和自定义 ArrayAdapter。并将 Firestore 文档转换为我制作的自定义 java 类。

我的文档设置为:

(字符串)标题:

(日期)到期日期:

(数字)exp:

(字符串)描述:

但是,我的逻辑中的某些东西似乎不起作用。下面是我的这个过程的代码:

Missions.java:

public class Missions {

    private String title;
    private Number exp;
    private String date;
    private String description;

    public Missions() {}

    public Missions(String title, Number exp, String date, String description) {
        this.title = title;
        this.exp = exp;
        this.date = date;
        this.description = description;
    }

    public String getTitle(){
        return title;
    }
    public Number getExp(){
       return exp;
    }
    public String getDate(){
        return date;
    }
    public String getDescription(){
        return description;
   }

}

MainActivity.java:

    public class MainActivity extends AppCompatActivity {
      private final String COLLECTION_KEY = "missions";

      //Views
      private TextView mHeaderView;
      private ListView mMissionListView;

      //Firebase
      private FirebaseFirestore db;

      //Adapter
      private MissionsAdapter mMissionAdapter;
      private ArrayList<Missions> mMissionsList;

      @Override
      protected void onCreate(Bundle savedInstanceState){
        /*
         * My code here deals with authentication
         *
         */
         super.onCreate(savedInstanceState);

         setContentView(R.layout.activity_main);

         mHeaderView = (TextView) findViewById(R.id.missionHeader);
         mMissionsListView = (ListView) findViewById(R.id.missionList);

         mHeaderView.setText("Available Missions"));

    //get Database
         db = FirebaseFirestore.getInstance();
    //Set up the ArrayList
         mMissionsList = new ArrayList<Missions>();
    //set the Adapter
        mMissionAdapter = new MissionsAdapter(this, mMissionsList);

        mMissionListView.setAdapter(mMissionAdapter);

        db.collection(COLLECTION_KEY).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                        @Override
                        public void onComplete(@NonNull Task<QuerySnapshot> task) {
                            if(task.isSuccessful()){
                                for(QueryDocumentSnapshot document : task.getResult()){

                                    Log.d("MissionActivity", document.getId() + " => " + document.getData());

                                    Missions miss = document.toObject(Missions.class);
                                    mMissionsList.add(miss);

                                }

                            }
                            else {
                                Log.d("MissionActivity", "Error getting documents: ", task.getException());
                            }
                        }
                    });
        //add the whole Arraylist of MIssions to the adapter
        mMissionAdapter.addAll(mMissionsList);
      }
    }

MissionsAdapter.java

    import android.app.Activity;
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.TextView;

    import java.util.List;



    public class MissionsAdapter extends ArrayAdapter<Missions> {
        public MissionsAdapter(Context context, List<Missions> object){
            super(context,0, object);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent){
            if(convertView == null){
                convertView =  ((Activity)getContext()).getLayoutInflater().inflate(R.layout.item_mission,parent,false);
            }

            TextView titleTextView = (TextView) convertView.findViewById(R.id.mission_title);
            TextView expTextView = (TextView) convertView.findViewById(R.id.mission_exp);
            TextView dateTextView = (TextView) convertView.findViewById(R.id.mission_date);
            TextView descriptionTextView = (TextView) convertView.findViewById(R.id.mission_description);

            Missions mission = getItem(position);

            titleTextView.setText(mission.getTitle());
            expTextView.setText(mission.getExp().toString());
            dateTextView.setText(mission.getDate());
            descriptionTextView.setText(mission.getDescription());


            return convertView;
        }

    }

item_missions.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="16dp">

        <TextView
            android:id="@+id/mission_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fontFamily="sans-serif-medium"
            android:textAppearance="?android:textAppearanceMedium"
            android:textColor="@color/input_login"
            android:hint="There will be a title"/>

        <TextView
            android:id="@+id/mission_exp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fontFamily="sans-serif"
            android:textAppearance="?android:textAppearance"
            android:textColor="@color/input_login"
            android:hint="There will be exp"/>

        <TextView
            android:id="@+id/mission_date"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fontFamily="sans-serif"
            android:textAppearance="?android:textAppearance"
            android:textColor="@color/input_login"
            android:hint="There will be a date"/>

        <TextView
            android:id="@+id/mission_description"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fontFamily="sans-serif"
            android:textAppearance="?android:textAppearance"
            android:textColor="@color/input_login"
            android:hint="There will be a description"/>

    </LinearLayout>

activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/missionHeader"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Edit/Create mission"
            android:gravity="center"
            android:textStyle="bold"
            android:textColor="@android:color/black"
            android:textAllCaps="true"
            android:textSize="30dp"
            android:paddingTop="20dp"
            />


        <ListView
            android:id="@+id/missionList"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        </ListView>


    </LinearLayout>

任何评论都会有所帮助。

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    你快到了。您的代码中的问题是您尝试使用空列表填充适配器,这是因为在您执行此操作时,您还没有完成从数据库中获取数据。请注意,onComplete() 方法具有异步行为。要解决这个问题,请使用以下代码:

    db.collection(COLLECTION_KEY).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            List<Missions> mMissionsList = new ArrayList<>();
            if(task.isSuccessful()){
                for(QueryDocumentSnapshot document : task.getResult()) {
                    Missions miss = document.toObject(Missions.class);
                    mMissionsList.add(miss);
                }
                ListView mMissionsListView = (ListView) findViewById(R.id.missionList);
                MissionsAdapter mMissionAdapter = new MissionsAdapter(this, mMissionsList);
                mMissionsListView.setAdapter(mMissionAdapter);
            } else {
                Log.d("MissionActivity", "Error getting documents: ", task.getException());
            }
        }
    });
    

    如你所见,我已经在这个方法中声明并使用了适配器。

    【讨论】:

    • 非常感谢,这正是我需要的解决方案。我仍然在日期得到一个空对象,但我很确定我最终可以解决这个问题。再次感谢
    • 因此在这方面进行了更多工作,我想知道如何单击列表视图中显示的任务之一并打开一个填充现有数据的编辑活动。我以为我可以使用 setOnClickListener 但我不确定如何将选定的任务传递给下一个活动,知道吗?
    • 是的,您可以使用setOnClickListener 并在 onClick 方法中使用:getItem(position) 方法。如果您无法解决这个新挑战,请发布另一个新问题,以便我和其他用户可以帮助您。干杯!
    • 什么是 QueryDocumentSnapshot。显示未解决?
    • @Sandeep QueryDocumentSnapshot 这是一门课。尝试使用DocumentSnapshot 而不是QueryDocumentSnapshot
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多