Как реализовать элемент OnClick, используя элемент результата поискового запроса Firebase - PullRequest
0 голосов
/ 01 июня 2018

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

mUserDatabase=FirebaseDatabase.getInstance().getReference("Users").child("UserProfile";
        mSearchField = findViewById(R.id.search_field);
        mSearchBtn = findViewById(R.id.search_btn);
        mResultList = 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(SearchActivity.this, "Searching......", Toast.LENGTH_LONG).show();

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

        FirebaseRecyclerAdapter<Users, UsersViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Users, UsersViewHolder>(
                Users.class,
                R.layout.search_list_layout,
                UsersViewHolder.class,
                firebaseSearchQuery
        ) {
            @Override
            protected void populateViewHolder(UsersViewHolder viewHolder, Users model, int position) {

                viewHolder.setDetails(getApplicationContext(), model.getUsername(), model.getSummary(), model.getImageurl());
            }
        };
        mResultList.setAdapter(firebaseRecyclerAdapter);
    }
    public static class UsersViewHolder extends RecyclerView.ViewHolder {
        View mView;
        private TextView user_name;
        private TextView user_summary;
        private ImageView user_image;
        public UsersViewHolder(View itemView) {
            super(itemView);
            mView = itemView;
        }

        public void setDetails(Context ctx, String userName,String userSummary,String userImage){
            user_name = mView.findViewById(R.id.name_text);
             user_summary = mView.findViewById(R.id.summary_text);
            user_image = mView.findViewById(R.id.profile_image);
            user_name.setText(userName);
            user_summary.setText(userSummary);
            Glide.with(ctx).load(userImage).into(user_image);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int pos = getAdapterPosition();
                    Snackbar.make(v, "Hello,How may i help you", Snackbar.LENGTH_LONG).setAction("Action", null).show();
                }
            });
        }

Как отображать содержимое в операции сведений при нажатии на один элемент в результате поиска.

На основе Предложение Parag Pawar , я попробовал следующее, но это не работает>

       @Override
        protected void populateViewHolder(UsersViewHolder viewHolder, Users model, int position) {

            viewHolder.setDetails(getApplicationContext(), model.getUsername(), model.getSummary(), model.getImageurl());
            final String each_key = getRef(position).getKey();


        }

    };

Затем в моем UserViewHolder я инициализировал onclick:

  mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent pDetail = new Intent(SearchActivity.this, ProfileDetail.class);
                Users each_key = each_key.get(getAdapterPosition());
                pDetail.putExtra(ProfileDetail.EXTRA_POSITION, each_key.getUserId());
                startActivity(pDetail);


            }
        });

Но я получаю ошибку переменная each_key, возможно, не была инициализирована

Исправлена ​​моя ошибка в соответствии с рекомендациями Parag Pawar и реализован он по щелчку внутри populateView`holder следующим образом:

 viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    /*Here use intent.putExtra() to send each_key on other activity and fetch data there*/
                    Toast.makeText(SearchActivity.this, "u clicked......" +position, Toast.LENGTH_LONG).show();
                    Intent each_key = new Intent(SearchActivity.this, ProfileDetail.class);
                    Users user = mResultList.get(position);
                    each_key.putExtra(ProfileDetail.EXTRA_POSITION, user.getUserId());
                    startActivity(each_key);



                } });

но я получаю ошибку здесь:

 Users user = mResultList.get(position);

Не удается разрешить метод 'get (int)'

mReultList isимя моего Recyclerview, и я инициализировал его следующим образом:

private RecyclerView mResultList;     

, но я не знаю, правильно ли я это делаю.Я знаю, что должен прикрепить результаты к адаптеру, но я не знаю, как это сделать.Поэтому я попытался:

  listItems = new ArrayList<>();
    firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<UsersList>(listItems,this);

Но, похоже, это тоже не работает

Обновлен код

Я создал массив:

 private List<UsersList> listItems;//UsersList is my modal class

Затем добавил его в мой onCreate:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search);
    listItems = new ArrayList<>();

Затем я реализовал putExtra следующим образом, используя этот массив следующим образом:

Intent each_key = new Intent(TestSearch.this, ProfileDetail.class);
                    UsersList user = listItems.get(position);
                  //Here use intent.putExtra() to send each_key on other activity and fetch data there
                    Toast.makeText(TestSearch.this, "u clicked......" +position, Toast.LENGTH_LONG).show();
                    each_key.putExtra(ProfileDetail.EXTRA_POSITION, user.getUserId());
                    startActivity(each_key);

Но получаю эту ошибку, когда я нажимаюпредмет:

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
                  at java.util.ArrayList.get(ArrayList.java:411)
                  at com.ecard.ecard.search.TestSearch$2$1.onClick(TestSearch.java:94)
                  at android.view.View.performClick(View.java:5637)
                  at android.view.View$PerformClick.run(View.java:22429)
                  at android.os.Handler.handleCallback(Handler.java:751)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:154)
                  at android.app.ActivityThread.main(ActivityThread.java:6119)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

Ответы [ 3 ]

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

Я сказал, что обе вещи идут в populateViewHolder (). Вы получаете неинициализированную ошибку, потому что вы используете each_key в классе Viewholder.

Скопируйте

    final String each_key = getRef(position).getKey();
viewHolder.itemView.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View v) { 
/*Here use intent.putExtra() to send each_key on other activity and fetch data there*/ 
} }); }

и вставьте его в метод populateViewHolder

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

В упражнении, содержащем ваши текущие элементы, на которые вы хотите нажать: Создайте строку для ссылки в вашем populateVieHolder:

 final String single_view = getRef(position).getKey();

Затем прикрепите клик к вашему ViewHolder:

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

И в вашем OnClick разместите ваши намерения и putExtras :

@Override
public void onClick(View view) {
//give your intent a name to reference from("moreDetail" in this case)
Intent moreDetail = new Intent(SearchActivity.this,MoreDetail.class);
//attach the intent reference to access each item and key 
moreDetail.putExtra(MoreDetail.EXTRA_POSITION,single_view);                       
startActivity(moreDetail);//Start the new activity

Затем в вашей более подробной информации: ДобавьтеСтрока ExtraPosition

 String single_view = getIntent().getExtras().getString(MoreDetail.EXTRA_POSITION);//get extra position reference previous view

С этого момента вам необходимо отображать ваши данные из firebase

Для доступа к отдельным значениям из Firebase

    firebaseRef.child(single_view).addListenerForSingleValueEvent(new ValueEventListener() {
               @Override
               public void onDataChange(DataSnapshot dataSnapshot) {
    //For single items
// for example:String user_name = (String) dataSnapshot.child("username").getValue();

или

Для доступа к значениям, прикрепленным к вашему адаптеру, с помощью Listview

 firebaseRef.child(single_view).addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
ListItem data = dataSnapshot.getValue(ListItem.class);
                listItems.add(data);
                adapter.notifyDataSetChanged();
        //if you are accessing your data from a ListView 

Существует так много способов сделать это. Другой способДля этого создайте интерфейс. Объявите прослушиватель onclick и контекст в вашем адаптере утилизатора:

 OnItemClickListener callback;
private Context mContext;

Затем внедрите прослушиватель Onclick в держатель представления

public static class UsersViewHolder extends RecyclerView.ViewHolder implements OnItemClickListener  {

добавьте onclick вполучить доступ к позиции, к вашему View Holder с помощью callback:

    @Override
    public void onClick(View v) {
        callback.onItemClick(getAdapterPosition());
    }

Затем создайте интерфейс:

 public interface OnItemClickListener {
        void onItemClick(int pos);
    }

В зависимости от вашего контекста: в более основной деятельности:

   @Override
public void onItemClick(int pos) {

    Intent pDetail = new Intent(this.getContext(), ProfileDetail.class);//get the context
    ListItem listItem = listItems.get(pos);//get the position
    //Then your puEtxra here followed by start activity
    startActivity(pDetail);
}

И, наконец, вызовите EXTRA_POSITION вваш подробный вид, а затем ваши снимки.Более подробную информацию вы можете найти в документации по firebase и в примерах быстрого запуска firebase на github: GitHub FirebaseDocs

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

Чтобы получить ключ от каждого элемента, в populateViewholder do Пример: -

final String each_key = getRef(position).getKey();

Чтобы установить Click Listeners для каждого элемента, в populateViewholder do

viewHolder.itemView.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View v) { 
            /*Here use intent.putExtra() to send each_key on other activity and fetch data there*/

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