Заполните представление списка, используя конкретные данные из консоли Firebase - PullRequest
0 голосов
/ 25 июня 2018

Мне нужна помощь с отображением данных с консоли Firebase. Таким образом, сцена состоит в том, что я поместил некоторые данные в консоль, используя отдельный класс под названием «TicketSubmitted». Мне нужно отобразить некоторые дочерние элементы данных в виде списка в «MainActivity». Класс модели для MainActivity называется «Ticket», а адаптер для представления списка называется «TicketAdapter»

.

код для MainActivity:

package com.android.example.ithelpdesk;
//imports

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;
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 = FirebaseDatabase.getInstance().getReference();

    FirebaseUser user = mFirebaseAuth.getCurrentUser();
    mUsername = user.getUid();

    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<String> arrayOfTicket = new ArrayList<>()
    mDatabaseReference.addChildEventListener(new ChildEventListener() {
                                                 @Override
                                                 public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

                                                     Ticket ticket = (Ticket)dataSnapshot.getValue(Ticket.class);
                                                     adapter.add(ticket);
                                                 }

                                                 @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.

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            FirebaseAuth.getInstance().signOut();
        }
    });

    drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

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

            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 Ticket {
public String TicketCategory;
 // public String Name;
public String Subcategory;
public String priority;
private String status;
private String comments;
private String cannedReply;


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 setStatus(String status) {
    this.status = status;
}

public String getTicketCategory() {
    return TicketCategory;
}

//public String getName(){return Name;}

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 static ArrayList<Ticket> getTicket()
{
    ArrayList<Ticket> tickets = new ArrayList<Ticket>();
    return tickets;
}}

Код для адаптера TicketAdapter:

public class TicketAdapter extends ArrayAdapter<Ticket> {

TicketAdapter(Context context, ArrayList<Ticket> tickets) {
    super(context, 0, tickets);
}

@SuppressLint("SetTextI18n")
@NonNull
@Override
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
    Ticket ticket = getItem(position);
    if (convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.tickets, parent, false);
    }

    TextView tvCategory = (TextView) convertView.findViewById(R.id.TicketCategory);
    TextView tvSubcategory = (TextView) convertView.findViewById(R.id.Subcategory);
    TextView tvPriority = (TextView) convertView.findViewById(R.id.priority);


    assert ticket != null;
    tvCategory.setText(ticket.TicketCategory);
    tvSubcategory.setText(ticket.Subcategory);
    tvPriority.setText(ticket.priority);


    return convertView;

}}

Я просто хочу отобразить категорию, подкатегорию и приоритет Ticket в установленном порядке в виде списка, но я не могу этого сделать. Также, когда я представляю новый childEventListener, я получаю эту ошибку, и приложение вылетает:

Скриншот

Я новичок в программировании Android, поэтому любые отзывы будут оценены ...

спасибо !!

Ответы [ 3 ]

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

Чтобы решить эту ошибку:

com.google.firebase.database.DatabaseException: Found two getters or fields with conflicting case sensitivity for property: subcategory

Пожалуйста, измените следующие строки кода:

public String TicketCategory;
// public String Name;
public String Subcategory;
public String priority;

на

private String TicketCategory;
// private String Name;
private  String Subcategory;
private  String priority;

И не забудьтедобавьте конструктор без аргументов в ваш класс Ticket.

public Ticket() {} //Needed for Firebase
0 голосов
/ 25 июня 2018

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

скажем, ваш узел, в котором вы сохраняете данные, называется Tickets

так что вместо этого:

 mDatabaseReference.addChildEventListener(new ChildEventListener() {....

сделать это:

 DatabaseReference tickets_ref = mDatabaseReference.child("Tickets");
 tickets_ref.addChildEventListener(new ChildEventListener() {....

вместо этого:

final ArrayList<String> arrayOfTicket = new ArrayList<>();

сделать это:

final ArrayList<Ticket> arrayOfTicket = new ArrayList<>();

теперь после этого:

final ArrayList<Ticket> arrayOfTicket = new ArrayList<>();

инициализируйте адаптер следующим образом:

 adapter = new TicketAdapter(context,arrayOfTicket);

и вместо этого:

adapter.add(ticket);

сделать это:

arrayOfTicket.add(ticket);
adapter.notifyDataSetChanged();
0 голосов
/ 25 июня 2018

Сначала в вашем журнале говорится, что вам необходимо переименовать поля Ticket, например, (не может начинаться с заглавной буквы):

public String ticketCategory;
public String subcategory;

Затем вы должны создать экземпляр adapter с помощью arrayOfTicket, а затем установить adapter на ListView (+ не забудьте вызвать adapter.notifyDataSetChanged() при добавлении / удалении объекта в списке):

final ListView listView = (ListView) findViewById(R.id.lvTicket);
final ArrayList<Ticket> arrayOfTicket = new ArrayList<>();
adapter = new TicketAdapter(this, arrayOfTicket); // Instanciate your adapter
listView.setAdapter(adapter); // Set the adapter to your ListView
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(); // Notify for changes to reload the list
    }

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