java.lang.String нельзя привести к

Я пытаюсь получить значение базы данных firebase, когда нажимаю на предложенный элемент автозаполнения. Код ниже - это то, как я пытаюсь его реализовать. Однако я, кажется, получаю ошибку java.lang.String cannot be cast to SearchInformation в этой строке:

sInfo = (SearchInformation) adapterView.getAdapter().getItem(i);

Я следую первому ответу из этого примера.

Примечание. Я не знаю, правильный ли это способ получения информации из базы данных firebase с помощью автозаполнения, но чтобы выяснить это, мне нужно сначала решить эту проблему.

Код:

public class Hot extends Fragment {

    private SearchInformation sInfo;
    private DatabaseReference database;


    public Hot() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_hot, container, false);

        database = FirebaseDatabase.getInstance().getReference();

        final ArrayAdapter<String> autoComplete = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1);

        database.child("AutoCompleteOptions").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                for (DataSnapshot suggestionSnapshot : dataSnapshot.getChildren()){

                    sInfo = suggestionSnapshot.getValue(SearchInformation.class);

                    autoComplete.add(sInfo.getEatery_name());
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
        AutoCompleteTextView ACTV= rootView.findViewById(R.id.actv);
        ACTV.setAdapter(autoComplete);
        ACTV.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

                sInfo = (SearchInformation) adapterView.getAdapter().getItem(i); // ** ERROR HERE **
                String anID = sInfo.getEatery_id(); 

                Log.i("ID is", anID);

            }
        });
        return rootView;
    }

}

Модель данных:

public class SearchInformation {

    private String eatery_name;
    private String eatery_id;

    public SearchInformation() {

    }

    public SearchInformation(String eatery_name, String eatery_id) {
        this.eatery_name = eatery_name;
        this.eatery_id = eatery_id;

    }

    public String getEatery_name() {
        return eatery_name;
    }

    public void setEatery_name(String eatery_name) {
        this.eatery_name = eatery_name;
    }

    public String getEatery_id() {
        return eatery_id;
    }

    public void setEatery_id(String eatery_id) {
        this.eatery_id = eatery_id;
    }

}

person ben    schedule 01.09.2017    source источник


Ответы (2)


Вам нужно изменить ArrayAdapter<String> на собственный адаптер ArrayAdapter<SearchInformation>. Затем, используя autoComplete.add(sInfo), вы можете получить весь объект SearchInformation с помощью adapterView.getAdapter().getItem(i)

person Stanislav Bondar    schedule 01.09.2017
comment
но тогда я бы не производил предложения автозаполнения (предлагает названия закусочных), которые я намереваюсь. Есть ли обходной путь? - person ben; 01.09.2017
comment
@ben Вам нужен специальный адаптер. Попробуйте это stackoverflow. ком/вопросы/8784249/ - person Stanislav Bondar; 01.09.2017
comment
Ссылка, которую вы мне дали, кажется полезной, и я планирую реализовать ответ @Carl Anderson. Однако я немного смущен тем, как это реализовать, особенно с базой данных Firebase. Не могли бы вы направить меня? Это будет высоко ценится! - person ben; 01.09.2017

Это потому, что это ArrayAdapter<String>, в нем есть строки. Таким образом, ваш getItem() также дает вам строку.

person Frank    schedule 01.09.2017