извлечение данных из firebase и создание listview с флажком

#android #firebase #firebase-realtime-database

#Android #firebase #firebase-база данных в реальном времени

Вопрос:

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

 ArrayList<States> stateList = new ArrayList<States>();
States _states = new States("10","BHAWARKUA",false);
stateList.add(_states);
  

ошибка logcat:
ListViewCheckboxesActivity $ 1 не может быть передан в android.content.Контекст

Ошибка Logcat:

      Process: com.example.listview1, PID: 22931
java.lang.ClassCastException: 
     com.example.listview1.ListViewCheckboxesActivity$1 cannot be cast to android.content.Context
     at com.example.listview1.ListViewCheckboxesActivity$MyCustomAdapter.<init>(ListViewCheckboxesActivity.java:135)
     at com.example.listview1.ListViewCheckboxesActivity$1.onChildAdded(ListViewCheckboxesActivity.java:55)
    at com.google.android.gms.internal.firebase_database.zzbt.zza(Unknown Source:71)
    at com.google.android.gms.internal.firebase_database.zzgx.zzdr(Unknown Source:2)
    at com.google.android.gms.internal.firebase_database.zzhd.run(Unknown Source:71)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:171)
    at android.app.ActivityThread.main(ActivityThread.java:6651)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824) 
  

States.java

   public class States
  {

String code = null;
String name = null;
boolean selected = false;

public States(String code, String name, boolean selected)
{
    super();
    this.code = code;
    this.name = name;
    this.selected = selected;
}

public String getCode()
{
    return code;
}

public void setCode(String code)
{
    this.code = code;
}

public String getName()
{
    return name;
}

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

public boolean isSelected()
{
    return selected;
}

public void setSelected(boolean selected)
{
    this.selected = selected;
}

}
  

ListViewCheckboxesActivity.java

 public class ListViewCheckboxesActivity extends Activity
{

MyCustomAdapter dataAdapter = null;


@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final ArrayList<States> stateList = new ArrayList<States>();

    final FirebaseDatabase firebaseDatabase= 
FirebaseDatabase.getInstance();
    DatabaseReference DatabaseReference = 
firebaseDatabase.getReference();
    DatabaseReference databaseReference= 
DatabaseReference.child("ComingStudents");




    Toast.makeText(this, "ok", Toast.LENGTH_SHORT).show();
    databaseReference.addChildEventListener(new ChildEventListener() 
{
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {States 
 value=dataSnapshot.child("stops").child("bhavarkuan")
           .getValue(States.class);
            stateList.add(value);
            dataAdapter = new 
          MyCustomAdapter(this,R.layout.state_info, stateList);
            ListView listView = findViewById(R.id.listView1);
            // Assign adapter to ListView
            listView.setAdapter(dataAdapter);
            listView.setOnItemClickListener(new 
           OnItemClickListener()
            {

                public void onItemClick(AdapterView<?> parent, View 
            view, int position, long id)
                {
                    // When clicked, show a toast with the TextView 
                    text
                    States state = (States) 
               parent.getItemAtPosition(position);
                    Toast.makeText(getApplicationContext(),"Clicked 
         on Row: "   state.getName(),
                            Toast.LENGTH_LONG).show();
                }
            });

        }

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

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

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

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    checkButtonClick();

}



private class MyCustomAdapter extends ArrayAdapter<States>
{

    private ArrayList<States> stateList;

    public MyCustomAdapter( ChildEventListener childEventListener, 
 int textViewResourceId, ArrayList<States> stateList)
    { super((Context) childEventListener, textViewResourceId, 
       stateList);
        this.stateList = new ArrayList<States>();
        this.stateList.addAll(stateList);
    }

    private class ViewHolder
    {
        TextView code;
        CheckBox name;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup 
   parent)
    {

        ViewHolder holder = null;

        Log.v("ConvertView", String.valueOf(position));

        if (convertView == null)
        {

            LayoutInflater vi =  
  (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            convertView = vi.inflate(R.layout.state_info, null);

            holder = new ViewHolder();
            holder.code = (TextView) 
   convertView.findViewById(R.id.code);
            holder.name = (CheckBox) 
    convertView.findViewById(R.id.checkBox1);

            convertView.setTag(holder);

            holder.name.setOnClickListener( new 
    View.OnClickListener()
            {
                public void onClick(View v)
                {
                    CheckBox cb = (CheckBox) v;
                    States _state = (States) cb.getTag();

                    Toast.makeText(getApplicationContext(), "Clicked 
    on Checkbox: "   cb.getText()   " is "   cb.isChecked(),
                            Toast.LENGTH_LONG).show();

                    _state.setSelected(cb.isChecked());
                }
            });

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

        States state = stateList.get(position);

        holder.code.setText(" ("   state.getCode()   ")");
        holder.name.setText(state.getName());
        holder.name.setChecked(state.isSelected());

        holder.name.setTag(state);

        return convertView;
    }

}

private void checkButtonClick()
{

    Button myButton = (Button) findViewById(R.id.findSelected);

    myButton.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v)
        {

            StringBuffer responseText = new StringBuffer();
            responseText.append("The following were selected...n");

            ArrayList<States> stateList = dataAdapter.stateList;

            for(int i=0;i<stateList.size();i  )
            {
                States state = stateList.get(i);

                if(state.isSelected())
                {
                    responseText.append("n"   state.getName());
                }
            }

            Toast.makeText(getApplicationContext(),
                    responseText, Toast.LENGTH_LONG).show();
        }
    });
    }

   }
  

xmls:

activity_main.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="vertical"
android:gravity="center"
android:background="#ffeeeeee">

<TextView android:layout_width="fill_parent"
    android:layout_height="wrap_content" android:padding="10dp"
    android:text="Available Stops" android:textSize="20sp" />

<Button android:id="@ id/findSelected"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Select your stops" />

<ListView android:id="@ id/listView1" android:layout_width="fill_parent"
    android:layout_height="fill_parent" />
</LinearLayout>
  

state_info.xml

  <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout 
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:orientation="vertical"
 android:padding="6dip">

 <CheckBox android:id="@ id/checkBox1"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_alignParentLeft="true"
 android:focusable="false"
 android:textColor="#ff00bb88"
 android:focusableInTouchMode="false"
 android:text="checkbox" />

<TextView android:id="@ id/code"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@id/checkBox1"
android:layout_alignBottom="@id/checkBox1"
android:layout_toRightOf="@id/checkBox1"
android:text="textview"
android:textColor="#ff000000"/>

</RelativeLayout>
  

Комментарии:

1. Пожалуйста, покажите свою структуру firebase

2. «ComingStudents»: { «остановки»: { «bhavarkuan»: { «широта» : 75.901, «долгота» : 22.691, «студенты» : 1 }, «хаджрана» : { «широта» : 75.901, «долгота» : 22.731, «студенты» : 1 }, «mr10» : { «широта»: 75.871, «долгота» : 22.764, «студенты»: 1 }, «виджайнагар»: { «широта» : 75.893, «долгота» : 22.748, «студенты» : 0 } } }

3. У вас есть код, имя и выбранные свойства в вашем объекте состояния, но они не существуют в вашей базе данных firebase.

4. «ComingStudents»: { «stops»: { «bhavarkuan»: { «code»: 5, «latitude» : 75.901, «longitude» : 22.691, «name»: «Mr10», «selected» : true, «students» : 1 }, «khajrana» : { «широта»: 75.901, «долгота» : 22.731, «студенты»: 1 }, «mr10»: { «широта» : 75.871, «долгота» : 22.764, «студенты» : 1 }, «виджайнагар» : { «широта» : 75.893, «долгота» : 22.748, «студенты» : 0 } }

5. я изменил на это, тогда ошибка все еще появляется

Ответ №1:

Можете ли вы изменить свой конструктор адаптера

 MyCustomAdapter( ChildEventListener childEventListener, int textViewResourceId, ArrayList<States> stateList)
  

Для

 MyCustomAdapter( ListViewCheckboxesActivity activity, int textViewResourceId, ArrayList<States> stateList)
  

при инициализации в activity отправьте ListViewCheckboxesActivity.this как значение и попробуйте один раз

Ваш конструктор пытается привести ChildEventListener к контексту, который, я думаю, вызывает исключение

Комментарии:

1. java.lang. Исключение NullPointerException: попытка вызвать виртуальный метод ‘java.lang. Строка com.example.listview1.States.getCode()’ для нулевой ссылки на объект в com.example.listview1.ListViewCheckboxesActivity$MyCustomAdapter.getView(ListViewCheckboxesActivity.java:189)

Ответ №2:

Предположим, что ваша структура firebase выглядит следующим образом.

 States
    autoId(XQSKNDLALALALDX...)
        code
        name
        selected
    autoId(XQSKNDLALALALDX...)
        code
        name
        selected
  

ваш запрос firebase

 MyCustomAdapter mAdapter = new MyCustomAdapter(this);

DatabaseReference dbRef = mDatabase.child("States");
dbRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            if (dataSnapshot.exists()) {
                State state = dataSnapshot.getValue(State.class);
                mAdapter.addState(state);
            }
        }

        @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) { }
    });
  

Ваш адаптер

  public class MyCustomAdapter extends RecyclerView.Adapter {

private List<State> stateList = new ArrayList<State>();
private Context mContext;
private LayoutInflater mInflater;

public MyCustomAdapter(Context context) {
    this.mContext = context;
    this.mInflater = LayoutInflater.from(mContext);
}

public void addState(State state) {
    this.stateList.add(state);
    this.notifyItemInserted(mChatList.size() - 1);
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {

      //...
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {

     //...
    }
}
  

Ответ №3:

проблема решена, теперь полностью ознакомьтесь с моим кодом

ListViewCheckboxesActivity.java

 package com.example.listview1;

public class ListViewCheckboxesActivity extends Activity
{

MyCustomAdapter dataAdapter = null;
FirebaseDatabase database;
DatabaseReference ref;
States states ;
States _states ;
ArrayList<States> stateList;
List<String> keys;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list);

    database= FirebaseDatabase.getInstance();
    ref=database.getReference("Stops");




    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            stateList = new ArrayList<States>();
            keys=new ArrayList<>();

            System.out.println("@@@@");
            //states=new States();
            System.out.println("@@@@");
            for(DataSnapshot ds: dataSnapshot.getChildren())
            {
                System.out.println(states=ds.getValue(States.class));
                if(states.isSelected()==false) {
                    keys.add(ds.getKey());
                    _states = new States(states.getCode(), states.getName(), states.isSelected());
                    states.setKey(ds.getKey());
                    System.out.println(states.getKey() "  " states.getName()   states.getCode()   states.isSelected());
                    stateList.add(_states);
                    System.out.println(stateList);

                }
            }

            displayListView();

            checkButtonClick();


        }

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

        }
    });
    //Generate list View from ArrayList

    //Generate list View from ArrayList
  //  displayListView();



}

   private void displayListView()
{


    //create an ArrayAdaptar from the String Array
    dataAdapter = new MyCustomAdapter(this,R.layout.state_info, stateList);
    ListView listView = (ListView) findViewById(R.id.listView1);
    // Assign adapter to ListView
    listView.setAdapter(dataAdapter);

    listView.setOnItemClickListener(new OnItemClickListener()
    {

        public void onItemClick(AdapterView<?> parent, View view, int position, long id)
        {
            // When clicked, show a toast with the TextView text
            States state = (States) parent.getItemAtPosition(position);
            Toast.makeText(getApplicationContext(),"Clicked on Row: "   state.getName(),
                    Toast.LENGTH_LONG).show();
        }
    });
}

   private class MyCustomAdapter extends ArrayAdapter<States>
   {

    private ArrayList<States> stateList;

    public MyCustomAdapter(Context context, int textViewResourceId,

                           ArrayList<States> stateList)
    {
        super(context, textViewResourceId, stateList);
        this.stateList = new ArrayList<States>();
        this.stateList.addAll(stateList);
    }

    private class ViewHolder
    {
        TextView code;
        CheckBox name;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {

        ViewHolder holder = null;

        Log.v("ConvertView", String.valueOf(position));

        if (convertView == null)
        {

            LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            convertView = vi.inflate(R.layout.state_info, null);

            holder = new ViewHolder();
            holder.code = (TextView) convertView.findViewById(R.id.code);
            holder.name = (CheckBox) convertView.findViewById(R.id.checkBox1);

            convertView.setTag(holder);

            holder.name.setOnClickListener( new View.OnClickListener()
            {
                public void onClick(View v)
                {
                    CheckBox cb = (CheckBox) v;
                    States _state = (States) cb.getTag();

                    Toast.makeText(getApplicationContext(), "Clicked on Checkbox: "   cb.getText()   " is "   cb.isChecked(),
                            Toast.LENGTH_LONG).show();

                    _state.setSelected(cb.isChecked());
                }
            });

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

        States state = stateList.get(position);

        holder.code.setText(" ("   state.getCode()   ")");
        holder.name.setText(state.getName());
        holder.name.setChecked(state.isSelected());

        holder.name.setTag(state);

        return convertView;
    }

   }

   private void checkButtonClick()
   {

    Button myButton = (Button) findViewById(R.id.findSelected);

    myButton.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v)
        {
        int j=0;
            StringBuffer responseText = new StringBuffer();


            final ArrayList<States> statList = dataAdapter.stateList;

            for(int i=0;i<statList.size();i  )
            {
                final States sta = statList.get(i);

                if(sta.isSelected()) {
                    responseText.append("n"   sta.getName());
           j  = j    sta.getCode();
                    System.out.println("@@@@@@@@@@@@");
                    System.out.println("@@@@@@@@@@@@@");
                    System.out.println("@@@@@@@@@@@@");
                    System.out.println("!!!!!!!!!!!!!");
           System.out.println(keys.get(i));

          // ref=database.getReference("stops").child("")

                }
            }
            if(j<=15) {
                 responseText.append("The following were selected n");
                Toast.makeText(getApplicationContext(),
                        responseText " Your total number of students "  j, Toast.LENGTH_LONG).show();


                for(int i=0;i<statList.size();i  )
                {
                    final States sta = statList.get(i);

                    if(sta.isSelected()) {

                        database.getReference("Stops").child(keys.get(i)).child("selected").setValue(true);



                    }   // ref=database.getReference("stops").child("")

                }

                System.out.println("@@@@@@@@@@@@");
                System.out.println("@@@@@@@@@@@@@");
                System.out.println("@@@@@@@@@@@@");
                System.out.println("!!!!!!!!!!!!!");

            }
            else
            {
                responseText.append(" Does not comes under bus seats limited to 15n");
                Toast.makeText(getApplication(),
                        responseText, Toast.LENGTH_LONG).show();
                for(int i=0;i<statList.size();i  )
                {
                    final States stat = statList.get(i);

                   stat.setSelected(false);



                }
                displayListView();

            }
        }
    });
   }

   }
  

States.java

  package com.example.listview1;

 public class States
 {

int code ;
String name ;
boolean selected ;
String key;

public String getKey() {
    return key;
}

public void setKey(String key) {
    this.key = key;
}

public States() {
}

public States(int code, String name, boolean selected) {
    this.code = code;
    this.name = name;
    this.selected = selected;
}

public int getCode() {

    return code;
}

public void setCode(int code) {
    this.code = code;
}

public String getName() {
    return name;
}

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

public boolean isSelected() {
    return selected;
}

public void setSelected(boolean selected) {
    this.selected = selected;
}
  

}

Иерархия базы данных «останавливается»: { «01»: { «code»: 3, «name»: «PALASIA», «selected» : true }, «02»: { «code»: 6, «name»: «mr10», «selected»: true }, «03»: { «code»: 2, «name»: «NAVLAKHA», «selected»: true }, «04»: { «code»: 4, «name»: «BHAWARKUA», «selected» : false }, «05»: { «code» :2, «имя»: «САД МЕГДУТ», «выбрано»: ложь }, «06»: { «код»: 4, «имя»: «КОЛОНИЯ ВИШНУПУРИ», «выбрано»: ложь}, «07»: { «код»: 6, «имя» :»ВИДЖАЙ НАГАР», «выбранный»: false }, «08»: { «код»: 9, «имя»: «MR 9», «выбранный» : false }, «09»: { «код»: 4, «имя»: «БАПАТ ЧАУРАХА», «выбрано «: false } },