android - 使用自定义适配器将数据从 firebase 数据库检索到多个 TextView 中,不显示任何错误/不显示任何内容?

标签 android firebase firebase-realtime-database android-adapter

一直在尝试使用自定义适配器将 firebase 数据库中的所有数据加载到四个不同的 TextView 中。让它与一个 TextView 一起工作非常简单。

事实证明,让它与自定义适配器一起工作要困难得多。代码运行,但界面中没有显示任何内容,也无法弄清楚原因,因为它也没有产生任何错误。关于为什么这不会产生错误或不显示数据的任何想法?

结构如下: enter image description here

记录模型:

public class Record {
    public String clicked;
    public String date;
    public String diff;
    public String sync;
    public String uid;

    public Record(){

    }

    public String getClicked() {
        return clicked;
    }
    public String getDate() {
        return date;
    }
    public String getDiff() {
        return diff;
    }
    public String getSync() {
        return sync;
    }
    public String getUid() {
        return uid;
    }


    public void setClicked(String clicked){
        this.clicked = clicked;
    }
    public void setDate(String date){
        this.date = date;
    }
    public void setDiff(String diff){
        this.diff = diff;
    }
    public void setSync(String time){
        this.sync = sync;
    }
    public void setUid(String uid){
        this.uid = uid;
    }

    public Record(String sync, String clicked, String diff, String date, String uid) {
        this.clicked = clicked;
        this.date = date;
        this.diff = diff;
        this.sync = sync;
        this.uid = uid;
    }

自定义适配器:

public class CustomAdapter extends BaseAdapter{
    Context c;
    ArrayList<Record> records;
    public CustomAdapter(Context c, ArrayList<Record> records) {
        this.c = c;
        this.records = records;
    }
    @Override
    public int getCount() {
        return records.size();
    }
    @Override
    public Object getItem(int position) {
        return records.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView==null)
        {
            convertView= LayoutInflater.from(c).inflate(R.layout.list_adapter_view,parent,false);
        }
        TextView timeTxt= (TextView) convertView.findViewById(R.id.texttime);
        TextView clickedTxt= (TextView) convertView.findViewById(R.id.textclick);
        TextView diffTxt= (TextView) convertView.findViewById(R.id.textdiff);
        TextView dateTxt= (TextView) convertView.findViewById(R.id.textdate);


        final Record s= (Record) this.getItem(position);
        timeTxt.setText(s.getSync());
        clickedTxt.setText(s.getClicked());
        diffTxt.setText(s.getDiff());
        dateTxt.setText(s.getDate());

        return convertView;
    }
}

Activity :

public class UserProfileActivity extends AppCompatActivity {
    private FirebaseAuth mFirebaseAuth;
    private FirebaseUser mFirebaseUser;  
    private String mUserId;
    CustomAdapter adapter;
    DatabaseReference db;
    ListView lv;
    ArrayList<Record> records = new ArrayList<>();

    static final ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();

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

        getSupportActionBar().setDisplayUseLogoEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setIcon(R.mipmap.ic_launcher);

        mFirebaseAuth = FirebaseAuth.getInstance();
        mFirebaseUser = mFirebaseAuth.getCurrentUser();


        if (mFirebaseUser == null) {
            loadLogInView();
        } else {
            mUserId = mFirebaseUser.getUid();
            lv = (ListView) findViewById(R.id.listView);

            db = FirebaseDatabase.getInstance().getReference().child("users").child(mUserId).child("records");
            adapter = new CustomAdapter(this, retrieve());
            lv.setAdapter(adapter);
        }
    }

    public ArrayList<Record> retrieve()
    {
        db.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                fetchData(dataSnapshot);
            }
            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                fetchData(dataSnapshot);
            }
            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {
            }
            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });
        return records;
    }

    private void fetchData(DataSnapshot dataSnapshot)
    {
        for (DataSnapshot ds : dataSnapshot.getChildren()){

            records.clear();
            Record record= dataSnapshot.getValue(Record.class);
            records.add(record);

        }
    }

activity_user_profile2.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent"

        android:paddingTop="5sp">

        <ListView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/listView" />
    </LinearLayout>


</RelativeLayout>

list_adapter_view.xml

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

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:paddingTop="5sp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true">

    <TextView
        android:textStyle="bold"
        android:paddingTop="20sp"
        android:textSize="20sp"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:id="@+id/texttime"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"/>

    <TextView
        android:textStyle="bold"
        android:paddingTop="20sp"
        android:textSize="20sp"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:id="@+id/textclick"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"/>

    <TextView
        android:textStyle="bold"
        android:paddingTop="20sp"
        android:textSize="20sp"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:id="@+id/textdiff"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"/>

    <TextView
        android:textStyle="bold"
        android:paddingTop="20sp"
        android:textSize="20sp"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:id="@+id/textdate"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"/>
</LinearLayout>

最佳答案

问题是 Activity 类中的几行不在正确的位置。这是有效的解决方案。

public class UserProfileActivity extends AppCompatActivity {
    private FirebaseAuth mFirebaseAuth;
    private FirebaseUser mFirebaseUser;

    private String mUserId;


    CustomAdapter adapter;
    DatabaseReference db;
    ListView lv;
    ArrayList<Record> records = new ArrayList<>();



    static final ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();



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

        getSupportActionBar().setDisplayUseLogoEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setIcon(R.mipmap.ic_launcher);

        mFirebaseAuth = FirebaseAuth.getInstance();
        mFirebaseUser = mFirebaseAuth.getCurrentUser();


        if (mFirebaseUser == null) {
            loadLogInView();
        } else {
            mUserId = mFirebaseUser.getUid();

            lv = (ListView) findViewById(R.id.listView);

            db = FirebaseDatabase.getInstance().getReference().child("users").child(mUserId).child("records");


            retrieve();




        }

    }


    public ArrayList<Record> retrieve()
    {


        db.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                fetchData(dataSnapshot);
            }
            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                fetchData(dataSnapshot);
            }
            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {
            }
            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });
        return records;
    }

    private void fetchData(DataSnapshot dataSnapshot)
    {




            Record record= dataSnapshot.getValue(Record.class);

            records.add(record);



        adapter = new CustomAdapter(this,records);
        lv.setAdapter(adapter);
    }



    private void loadLogInView() {
        Intent intent = new Intent(this, LoginActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(intent);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

        if (id == R.id.action_logout) {
            mFirebaseAuth.signOut();
            loadLogInView();
        }

        return super.onOptionsItemSelected(item);
    }

}

关于android - 使用自定义适配器将数据从 firebase 数据库检索到多个 TextView 中,不显示任何错误/不显示任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44219949/

相关文章:

c# - 如何在 Xamarin Shell 中自定义顶部选项卡 (ShellSection) 的外观?

android - 在 AVD 上运行 API 28 但不是 API 24 的应用程序

android - 使用 Firebase 登录 Android - statusCode DEVELOPER_ERROR

javascript - Firebase 使用电子邮件和密码创建用户并将数据放入数据库

java - 在图表引擎中显示多个图表

android - AndroidX RecyclerView View 与 NestedScrollView 的滚动行为

javascript - 使用 Firebase 实现无密码登录的最佳方式

ios - 在创建用户之前检查 Firebase 上是否存在数据

javascript - 渲染数据前添加条件和排序

swift - 当明显有数据时,Firebase 字典返回 nil