【问题标题】:How do I access the children in my firebase database and display them in the activity according to the listview item selected如何访问我的 firebase 数据库中的子项并根据所选的列表视图项在活动中显示它们
【发布时间】:2018-06-27 07:47:16
【问题描述】:

我有我的应用程序,我需要显示有关在列表视图中单击的项目的信息。然而,这是存储在我的 firebase 数据库中的数据。数据库如下所示:

现在我想单击列表视图项,以便我可以在不同的活动中显示与其对应的信息。

存储listview和Firebase的MainActivity的代码是:

 public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {


DrawerLayout drawer;
ActionBarDrawerToggle toggle;
private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference mDatabaseReference;
private ChildEventListener mChildEventListener;
private FirebaseAuth mFirebaseAuth;
private FirebaseAuth.AuthStateListener mAuthStateListener;
public TicketAdapter adapter;
private final static  int RC_SIGN_IN = 2;
public String mUsername;
public static String ComplaintID;
public static String StatusImg;
public static String TicketCat;
public static String SubCat;
private static final String TAG = "MainActivity";


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


    mFirebaseAuth = FirebaseAuth.getInstance();
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    mDatabaseReference = mFirebaseDatabase.getReference().child("Ticket");

    mAuthStateListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = mFirebaseAuth.getCurrentUser();
            if (user != null) {
                onSignedInInitialized(user.getDisplayName());
            } else {
                onSignedOutCleanup();
                startActivityForResult(
                        getInstance()
                                .createSignInIntentBuilder()
                                .setIsSmartLockEnabled(false)
                                .setAvailableProviders(Arrays.asList(
                                        new AuthUI.IdpConfig.EmailBuilder().build(),
                                        new AuthUI.IdpConfig.GoogleBuilder().build()))
                                .build(),
                        RC_SIGN_IN);
            }
        }
    };

    final ListView listView = (ListView)findViewById(R.id.lvTicket);
    final ArrayList<Ticket> arrayOfTicket = new ArrayList<>();
    adapter = new TicketAdapter(this, arrayOfTicket);
    listView.setAdapter(adapter);

    mDatabaseReference.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            Ticket ticket = (Ticket)dataSnapshot.getValue(Ticket.class);
            adapter.add(ticket);
            adapter.notifyDataSetChanged();
            assert ticket != null;

        }

        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
    mDatabaseReference = FirebaseDatabase.getInstance().getReference();
    final DatabaseReference TicketCategory = mDatabaseReference.child("Ticket").child("ticketCategory");

    TicketCategory.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String TCategory = dataSnapshot.child("ticketCategory").getValue(String.class);
            TicketCat = TCategory;
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            Ticket ticket = new Ticket();

            Intent intent = new Intent(view.getContext(), ComplaintDetail.class);

            startActivity(intent);
        }


    });

    final Button button = (Button) findViewById(R.id.complaintbutton);
    button.setOnClickListener(new View.OnClickListener() {
                                  public void onClick(View view) {
                                      Intent intent = new Intent(MainActivity.this, TicketCategory.class);
                                      startActivity(intent);
                                  }
                              }
    );

}

@Override
protected void onPostCreate(Bundle savedInstanceState)
{
    super.onPostCreate(savedInstanceState);
    toggle.syncState();
}

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId())
    {
        case R.id.action_settings:
        {
            AuthUI.getInstance().signOut(this);
            return true;
        }
        default:
            return super.onOptionsItemSelected(item);
    }
}

private void detachDatabaseReadListener()
{
    if(mChildEventListener != null)
    {
        mDatabaseReference.removeEventListener(mChildEventListener);
        mChildEventListener = null;
    }
}

@Override
protected void onResume()
{
    super.onResume();
    mFirebaseAuth.addAuthStateListener(mAuthStateListener);
}

@Override
protected void onPause()
{
    super.onPause();
    mFirebaseAuth.removeAuthStateListener(mAuthStateListener);
}

private void onSignedInInitialized(String username)
{
    mUsername = username;
   // attachDatabaseReadListener();
}

private void onSignedOutCleanup()
{
    mUsername = null;

}

这是我要显示孩子的活动的代码:

 public class ComplaintDetail extends AppCompatActivity {

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

    TextView tvComplaintID = (TextView)findViewById(R.id.complaintid);
    TextView tvTicketCat = (TextView)findViewById(R.id.TicketHeading);
    TextView tvSubCat = (TextView)findViewById(R.id.Subheading);

    //tvComplaintID.setText(MainActivity.StatusImg);
     tvTicketCat.setText( MainActivity.TicketCat);
  // tvSubCat.setText(MainActivity.SubCat);


    final Button butt = findViewById(R.id.review);
    butt.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            Intent intent = new Intent(ComplaintDetail.this, Review.class);
            startActivity(intent);
        }
    });

    final Button button = findViewById(R.id.close);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            Toast.makeText(ComplaintDetail.this, "This ticket is closed!!", Toast.LENGTH_SHORT).show();
        }
    });

}}

我想显示孩子:ticketCategory、子类别和状态。 我将非常感谢任何帮助。 谢谢!!

[编辑]

 public class Ticket {
String ticketCategory;
String name;
String complaintID;
String subcategory;
String priority;
String status;
private String comments;
private String cannedReply;

public Ticket(){}


public Ticket (String ticketCategory, String subcategory, String priority, String status, String comments, String cannedReply)
{
    this.ticketCategory = ticketCategory;
 //   this.Name = Name;
    this.subcategory = subcategory;
    this.priority = priority;
    this.status = status;
    this.comments = comments;
    this.cannedReply = cannedReply;
}

public void setTicketCategory(String ticketCategory) {
    this.TicketCategory = ticketCategory;
}

public void setName(String name) {
    this.Name = name;
}

public void setSubcategory(String subcategory) {
    this.Subcategory = subcategory;
}

public void setPriority(String priority) {
    this.priority = priority;
}*/

public void setStatus(String status) {
    this.status = status;
}

public String getTicketCategory() {
    return ticketCategory;
}



public String getSubcategory() {
    return subcategory;
}

public String getPriority() {
    return priority;
}

public String getComments() {
    return comments;
}

public void setComments(String comments) {
    this.comments = comments;
}

public String getCannedReply() {
    return cannedReply;
}

public void setCannedReply(String cannedReply) {
    this.cannedReply = cannedReply;
}

public String getStatus() {return status;}

public String getComplaintID() {
    return complaintID;
}

public static ArrayList<Ticket> getTicket()
{
    ArrayList<Ticket> tickets = new ArrayList<Ticket>();
    return tickets;
}}

【问题讨论】:

    标签: android firebase listview firebase-realtime-database


    【解决方案1】:

    只需将您的票证类设为可序列化并在 bundel 中传递它并在下面的其他活动中解析
    首先更改您的 Ticket 类定义,如下所示

    public class Ticket implements Serializable {
    

    然后像下面这样更改您的点击代码

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                    Intent intent = new Intent(view.getContext(), ComplaintDetail.class);
                    intent.putExtra("ticket", ticket);
                    startActivity(intent);
                }
            });
    

    最后在下面的第二个活动中解析并获取您的对象

    Ticket ticket= (Ticket) getIntent().getSerializableExtra("ticket");
    

    【讨论】:

    • 它不工作。它给出了一个 nullPointerException: Attempt to read from field Ticket.ticketCategory on a null object reference。 :(
    【解决方案2】:
       listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
    
    
                    Intent intent = new Intent(view.getContext(), ComplaintDetail.class);
                    intent.putExtra("ticket", ticket);
                    startActivity(intent);
                }
        });
    

    我在意图中提到的对象是您从 fireabse 接收的对象,您需要使对象可解析才能将其发送到另一个活动。因此,请确保使其可解析。 下面是实现parceable接口的模型类:-

    public class Ticket implements Parcelable {
        private String ticketCategory;
        private String name;
        private String complaintID;
        private String subcategory;
        private String priority;
        private String status;
        private String comments;
        private String cannedReply;
    
        public Ticket() {
        }
    
    
        public Ticket(String ticketCategory, String subcategory, String priority, String status, String comments, String cannedReply) {
            this.ticketCategory = ticketCategory;
            //   this.Name = Name;
            this.subcategory = subcategory;
            this.priority = priority;
            this.status = status;
            this.comments = comments;
            this.cannedReply = cannedReply;
        }
    
        public String getTicketCategory() {
            return ticketCategory;
        }
    
        public void setTicketCategory(String ticketCategory) {
            this.ticketCategory = ticketCategory;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getComplaintID() {
            return complaintID;
        }
    
        public void setComplaintID(String complaintID) {
            this.complaintID = complaintID;
        }
    
        public String getSubcategory() {
            return subcategory;
        }
    
        public void setSubcategory(String subcategory) {
            this.subcategory = subcategory;
        }
    
        public String getPriority() {
            return priority;
        }
    
        public void setPriority(String priority) {
            this.priority = priority;
        }
    
        public String getStatus() {
            return status;
        }
    
        public void setStatus(String status) {
            this.status = status;
        }
    
        public String getComments() {
            return comments;
        }
    
        public void setComments(String comments) {
            this.comments = comments;
        }
    
        public String getCannedReply() {
            return cannedReply;
        }
    
        public void setCannedReply(String cannedReply) {
            this.cannedReply = cannedReply;
        }
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(this.ticketCategory);
            dest.writeString(this.name);
            dest.writeString(this.complaintID);
            dest.writeString(this.subcategory);
            dest.writeString(this.priority);
            dest.writeString(this.status);
            dest.writeString(this.comments);
            dest.writeString(this.cannedReply);
        }
    
        protected Ticket(Parcel in) {
            this.ticketCategory = in.readString();
            this.name = in.readString();
            this.complaintID = in.readString();
            this.subcategory = in.readString();
            this.priority = in.readString();
            this.status = in.readString();
            this.comments = in.readString();
            this.cannedReply = in.readString();
        }
    
        public static final Parcelable.Creator<Ticket> CREATOR = new Parcelable.Creator<Ticket>() {
            @Override
            public Ticket createFromParcel(Parcel source) {
                return new Ticket(source);
            }
    
            @Override
            public Ticket[] newArray(int size) {
                return new Ticket[size];
            }
        };
    }
    

    所以,我有 set 和 get 方法并实现了 parceable 即使类 parceable 以便您可以发送整个对象。现在在您将接收的其他活动中,您可以使用如下 get 方法

    首先通过onCreate中的getIntent()获取intent,并声明对象Ticket。

     ticket = getIntent().getParcelableExtra("Ticket");
    

    如果您需要该对象,您可以直接访问它,如下所示

    ticket.getSubcategory();
        ticket.getTicketCategory();
        ticket.getStatus();
    

    所以,那就是问我你是否没有得到任何东西以及它是否不起作用。

    【讨论】:

    • 感谢您的帮助,但由于我不知道该怎么做,所以我无法做到这一点……我对 android 还是很陌生。我也发布了模型类。
    • 我已经编辑并添加了带有实现parceable接口的模型类的ans。检查一下。
    • 它仍然无法正常工作。它给出了一个 nullPointerException: Attempt to read from field Ticket.ticketCategory on a null object reference。
    • 是的,首先你需要将数据分配给对象,然后发送它。如果你不这样做,那么你发送的是空对象,如果在空对象上调用 get 方法,它会给你 nullPointerException 。所以,首先,当您从 firebase 收到数据时,将数据分配给对象。如果您仍然无法做到,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    相关资源
    最近更新 更多