如何从Firebase数据库读取数据并使用ArrayAdapter在ListView中显示多个字段 [英] How to Read Data from Firebase Database and Display Multiple Fields in ListView with ArrayAdapter

查看:78
本文介绍了如何从Firebase数据库读取数据并使用ArrayAdapter在ListView中显示多个字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我花了大部分时间试图弄清楚如何从我的Firebase数据库中读取数据并通过ArrayAdapterListView中显示多个字段.终于让ListView在一个textview中显示一个数据后,我被困在尝试显示其他两个字段.

I have spent the better half of the day trying to figure out how to read data from my firebase database and display multiple fields in a ListView via an ArrayAdapter. After finally getting my ListView to display one piece of data in one textview, I am stuck trying to display two other fields.

在我的MainActivity类中,我在Adapter构造函数中使用了android.R.layout.simple_list_item_1,因为有人告诉我textViewResourceID参数只能包含一个TextView.因此,重申我的问题:我不知道如何使用数组适配器显示多个字段.该应用程序当前仅显示 make 字段.在此先多谢了,我大约一周前才开始android开发!这是我的代码如下:

In my MainActivity class I used the android.R.layout.simple_list_item_1 in the Adapter constructor because I was told that the textViewResourceID argument must only contain one TextView. So to reiterate my problem: I can not figure out how to display multiple fields with an array adapter. This app currently only displays the make field. Thanks so much in advance, I only started android development about a week ago! Here is my code below:

public class SearchModel {

    public String make;
    private String model;
    private String stock;

    public SearchModel() {}

    public String getMake() {
        return this.make;
    }

    public void setMake(String make) {
        this.make = make;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public String getStock() {
        return stock;
    }

    public void setStock(String stock) {
        this.stock = stock;
    }
}

MainActivity.java

(我省略了onCreate()之后的班级无关部分)

MainActivity.java

(I omitted the irrelevant bottom section of the class after onCreate())

public class MainActivity extends AppCompatActivity {

    private DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("users").child("user1");
    private ListView mListView;
    private TextView tv_make;
    private TextView tv_model;
    private TextView tv_stock;

    private ArrayList<String> list = new ArrayList<>();
    private ArrayAdapter<String> adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);



        tv_make = (TextView) findViewById(R.id.tv_list_item_make);
        tv_model = (TextView) findViewById(R.id.tv_list_item_model);
        tv_stock = (TextView) findViewById(R.id.tv_list_item_stock);

        databaseReference.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
                String value = snapshot.child("make").getValue(String.class);
                list.add(value);

                mListView = (ListView) findViewById(R.id.lv_searches);
                adapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, list);
                mListView.setAdapter(adapter);
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot snapshot) {
            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
            }
        });

        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

这是content.main.xml中的ListView:

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

这是list_item.xml,它应该位于我的ListView中.在这里,我想在SearchModel.java的实例中显示三个String值(品牌,型号,库存).

And here is the list_item.xml which is supposed to sit inside my ListView. This is where I would like to display the three String values (make, model, stock) in an instance of SearchModel.java.

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:padding="10dp">

    <TextView
        android:id="@+id/tv_list_item_make"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tv_list_item_model"
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintBottom_toBottomOf="parent" />

    <TextView
        android:id="@+id/tv_list_item_stock"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

这是我的firebase数据库布局:

This is my firebase database layout:

推荐答案

被困两天后,我得以回答自己的问题!希望这将有助于将来的初学者尝试在ArrayAdapter中显示自定义视图.基本上,我创建了一个自定义的ArrayAdapter类,其中可以包含三个TextViews.

after two days of being stuck I was able to answer my own question! Hopefully this will help future beginners stuck trying to display a custom view within an ArrayAdapter. Basically, I created a custom ArrayAdapter class which could hold three TextViews inside of it.

我绝不是专家,也无法像其他人一样对此进行解释,因此,我将粘贴指向我遵循并成功的两个视频教程的链接.

I am in no means an expert and will not be able to explain this as well as others, so instead, I will paste a link to the two video tutorials that I followed and had success with.

Android初学者教程#8-用于显示多列的自定义ListView适配器 https://www.youtube.com/watch?v=E6vE8fqQPTE&t= 392s

Android Beginner Tutorial #8 - Custom ListView Adapter For Displaying Multiple Columns https://www.youtube.com/watch?v=E6vE8fqQPTE&t=392s

Android初学者教程#9-自定义ListView适配器[带有加载动画] https://www.youtube.com/watch?v=SApBLHIpH8A

Android Beginner Tutorial #9 - Custom ListView Adapter [With Loading Animation] https://www.youtube.com/watch?v=SApBLHIpH8A

这是我下面更新的代码:

Here is my updated code below:

public class CustomAdapter extends BaseAdapter {

    private static ArrayList<SearchModel> searchArrayList;
    private LayoutInflater mInflater;
    private Context mContext;
    private int lastPosition;

    /**
     * Holds elements in a view
     */
    static class ViewHolder {
        TextView make;
        TextView model;
        TextView stock;
    }

    public CustomAdapter(Context context, ArrayList<SearchModel> results) {
        searchArrayList = results;
        mContext = context;
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return searchArrayList.size();
    }

    @Override
    public Object getItem(int position) {
        return searchArrayList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        String make = searchArrayList.get(position).getMake();
        String model = searchArrayList.get(position).getModel();
        String stock = searchArrayList.get(position).getStock();

        final View result;

        ViewHolder holder;

        if (convertView == null) {

            LayoutInflater inflater = LayoutInflater.from(mContext);
            convertView = inflater.inflate(R.layout.list_item, parent, false);
            holder = new ViewHolder();
            holder.make = (TextView) convertView.findViewById(R.id.tv_list_item_make);
            holder.model = (TextView) convertView.findViewById(R.id.tv_list_item_model);
            holder.stock = (TextView) convertView.findViewById(R.id.tv_list_item_stock);

            result = convertView;
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
            result = convertView;
        }

        Animation animation = AnimationUtils.loadAnimation(mContext,
                (position > lastPosition) ? R.anim.load_down_anim : R.anim.load_up_anim);
        result.startAnimation(animation);
        lastPosition = position;

        holder.make.setText(make);
        holder.model.setText(model);
        holder.stock.setText(stock);

        return convertView;
    }
}

MainActivity.java(仅onCreate方法)

MainActivity.java (Only the onCreate method)

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        databaseReference.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
                String make = snapshot.child("make").getValue(String.class);
                String model = snapshot.child("model").getValue(String.class);
                String stock = snapshot.child("stock").getValue(Long.class).toString();
                SearchModel searchModel = new SearchModel(make, model, stock);
                searchList.add(searchModel);

              CustomAdapter customAdapter = new CustomAdapter(getApplicationContext(), searchList);

                mListView = (ListView) findViewById(R.id.lv_searches);
                mListView.setAdapter(customAdapter);
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot snapshot) {
            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
            }
        });

这篇关于如何从Firebase数据库读取数据并使用ArrayAdapter在ListView中显示多个字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆