он не выполняет onCreateViewHolder в - PullRequest
0 голосов
/ 24 мая 2018

Я новичок в Android Studio.Я делаю проект в университете, и мы используем Firebase.Я пытаюсь научиться этому.Поэтому я хотел создать инструмент поиска.Я пытался сделать это руководство для Firebase Search: https://youtu.be/b_tz8kbFUsU Вот исходный код: https://drive.google.com/file/d/1RH9HlhcRsHVkAjHkVoVL3p9aofr9e43C/view

Но, похоже, конструкция RecycleView устарела, поэтому я искал ее в интернете, какизмените его, в компиляторе нет ошибок, но он не отображает список запросов в RecycleView.Поэтому я обнаружил в отладчике, что он не выполняет onCreateViewHolder.

Основное действие (изменено на MainTestActivity):

public class MainTestActivity extends AppCompatActivity {

private EditText mSearchField;
private ImageButton mSearchBtn;

private RecyclerView mResultList;

private DatabaseReference mUserDatabase;

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

    mUserDatabase = FirebaseDatabase.getInstance().getReference("UsersTest");


    mSearchField = (EditText) findViewById(R.id.search_field);
    mSearchBtn = (ImageButton) findViewById(R.id.search_btn);

    mResultList = (RecyclerView) findViewById(R.id.result_list);
    mResultList.setHasFixedSize(true);
    mResultList.setLayoutManager(new LinearLayoutManager(this));

    mSearchBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            String searchText = mSearchField.getText().toString();

            firebaseUserSearch(searchText);

        }
    });
}

private void firebaseUserSearch(String searchText) {

    Toast.makeText(MainTestActivity.this, "Started Search", Toast.LENGTH_LONG).show();

    Query firebaseSearchQuery = mUserDatabase.orderByChild("name").startAt(searchText).endAt(searchText + "\uf8ff");

    Log.d(MainTestActivity.class.getSimpleName(), "LOG TEST"/*firebaseSearchQuery.toString()*/);

    FirebaseRecyclerOptions<UsersTest> options =
            new FirebaseRecyclerOptions.Builder<UsersTest>()
                    .setQuery(firebaseSearchQuery, UsersTest.class)
                    .build();

    FirebaseRecyclerAdapter firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<UsersTest, UsersViewHolder>(options) {
        @Override
        public UsersViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.list_test_layout, parent, false);

            return new UsersViewHolder(view);
        }

        @Override
        protected void onBindViewHolder(UsersViewHolder holder, int position, UsersTest model) {
            // Bind the Users object to the UsersViewHolder
            // ...
        }
        protected void populateViewHolder(UsersViewHolder viewHolder, UsersTest model, int position) {


            viewHolder.setDetails(getApplicationContext(), model.getName(), model.getStatus(), model.getImage());

        }
    };

    mResultList.setAdapter(firebaseRecyclerAdapter);

}


// View Holder Class

public static class UsersViewHolder extends RecyclerView.ViewHolder {

    View mView;

    public UsersViewHolder(View itemView) {
        super(itemView);

        mView = itemView;

    }

    public void setDetails(Context ctx, String userName, String userStatus, String userImage){

        TextView user_name = (TextView) mView.findViewById(R.id.name_text);
        TextView user_status = (TextView) mView.findViewById(R.id.status_text);
        ImageView user_image = (ImageView) mView.findViewById(R.id.profile_image);


        user_name.setText(userName);
        user_status.setText(userStatus);

        Glide.with(ctx).load(userImage).into(user_image);


    }




}

}

1 Ответ

0 голосов
/ 24 мая 2018

tvacstudio - один из лучших преподавателей Firebase. К сожалению, некоторые из его видео с Firebase устарели;Чтобы решить эту проблему, пожалуйста, сделайте это

В вашем onStart ()

@Override
protected void onStart() {
    super.onStart();
    firebaseRecyclerAdapter.startListening();
}

, а также в onStop ():

@Override
protected void onStop() {
    super.onStop();
    firebaseRecyclerAdapter.stopListening();
}

PS: ваш зритель должен вернутьпредставление и bindViewHolder никогда не используются для заполнения данными, которые будут отображаться в вашем RecyclerView.

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

Вы передаете держатель видапредставление здесь:

 View mView;

    public UsersViewHolder(View itemView) {
        super(itemView);

        mView = itemView;

    }

и получение его здесь:

@Override
        public UsersViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.list_test_layout, parent, false);

            return new UsersViewHolder(view);
        }

Это хорошо, и это нормально, но вам нужно заполнить данные из list_test_layout в вашем onbindviewholder, иначе вы будетене вижу результатов:

  @Override
        protected void onBindViewHolder(UsersViewHolder holder, int position, UsersTest model) {
            // Bind the Users object to the UsersViewHolder
            // ...
        }

Пожалуйста, ознакомьтесь с официальной документацией, чтобы лучше понять, как она работает:

https://github.com/firebase/FirebaseUI-Android/blob/master/database/README.md

Например, полный комплект bindViewHolder и ViewHolder должен выглядеть следующим образом:

@Override
        protected void onBindViewHolder(PeopleVH holder, int position, PersonModel model) {
            holder.setPersonFirstName(model.getFirstName()); // we are setting to the holder view the firstname of a user
            holder.setPersonLastName(model.getLastName()); // and we are binding the same data into the lastname
        }

        @Override
        public PeopleVH onCreateViewHolder(ViewGroup parent, int viewType) {

            View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.single_row_people_rv, parent, false); // here as you can see is the "user_row.xml" that will contain 2 textviews for user name and lastname

            return new PeopleVH(view); // now we return a view in the viewholder in order to access it in the bindviewholder and reference to each of those views to populate
        }
    };

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

     @Override
                protected void onBindViewHolder(UsersViewHolder holder, int position, UsersTest model) {

// just call your UsersTest bean and popualate the data , this is just an example , i dont know what fields you have in UsersTest 

                    holder.setPersonFirstName(model.getFirstName()); // we are setting to the holder view the firstname of a user
                    holder.setPersonLastName(model.getLastName()); // and we are binding the same data into the lastname
                }

                @Override
                public UsersViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

                    View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.list_test_layout, parent, false); // here as you can see is the "user_row.xml" that will contain 2 textviews for user name and lastname

                    return new UsersViewHolder(view); // now we return a view in the viewholder in order to access it in the bindviewholder and reference to each of those views to populate
                }
            };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...