Как получить доступ к дочерним элементам в моей базе данных Firebase и отобразить их в упражнении в соответствии с выбранным элементом списка - PullRequest
0 голосов
/ 27 июня 2018

У меня есть приложение, в котором мне нужно отобразить информацию, касающуюся элемента, на который щелкают в просмотре списка. Однако это данные, хранящиеся в моей базе данных Firebase. База данных выглядит так:

Database

Теперь я хочу щелкнуть элемент списка, чтобы отобразить информацию, соответствующую ему, в другом упражнении.

Код для MainActivity, где хранится список и Firebase:

 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();
        }
    });

}}

Я хочу отобразить детей: ticketКатегория, подкатегория и статус . Я буду очень признателен за любую помощь. спасибо !!

[ РЕДАКТИРОВАТЬ * * тысяча двадцать-одиной] * * тысяча двадцать-два 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; }}

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Просто сделайте свой билетный сериал как сериализуемый и передайте его в bundel и анализируйте в других действиях как ниже
Сначала измените определение класса билета, как показано ниже

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");
0 голосов
/ 27 июня 2018
   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, и вам нужно сделать объект доступным для анализа, чтобы иметь возможность отправить его в другое действие. Поэтому убедитесь, что он сделан доступным. Ниже приведен класс модели с реализуемым интерфейсом: -

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, т.е. сделал класс доступным, чтобы вы могли отправлять весь объект. Теперь в другой деятельности, где вы будете получать, вы можете просто использовать методы get, как показано ниже

Сначала получите намерение через getIntent () в onCreate и объявите объект Ticket.

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

А там, где вам нужен объект, вы можете напрямую получить к нему доступ, как показано ниже

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

Так вот, спросите меня, не получили ли вы что-нибудь и не работает ли оно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...