【问题标题】:How to implement OnClick item using firebase search query result item如何使用 Firebase 搜索查询结果项实现 OnClick 项
【发布时间】:2018-06-01 15:56:45
【问题描述】:

我创建了一个 firebase 搜索查询,它运行良好。但现在我似乎无法弄清楚如何进行 onlick 并获取项目位置。以下是我的 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 中实现了他的 onclick,如下所示:

 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 是我的 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)

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    要从每个项目中获取密钥,请在 populateViewholder 中执行 示例:-

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

    要在每个项目上设置 Click Listeners,请在 populateViewholder 中执行

    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*/
    
       } }); }
    

    【讨论】:

    • 我试过你的建议。它不起作用。请查看我在哪里实施你的建议的编辑问题
    【解决方案2】:

    在包含您当前的活动中 您要点击的项目: 在您的 populateVieHolder 中创建一个要引用的字符串:

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

    然后将 onclick 附加到您的 ViewHolder:

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

    然后在您的 OnClick 中放置您的 intentsputExtras

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

    或者

    用于使用列表视图访问附加到适配器的值

     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 以访问位置:

        @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,然后调用您的数据快照。 您可以从 github 上的 firebase 文档和 firebase 快速入门示例中找到更多详细信息: GitHub FirebaseDocs

    【讨论】:

    • 这是完美的。谢谢。它帮助我解决了我的问题
    【解决方案3】:

    我说这两件事都在 populateViewHolder() 由于您在 Viewholder 类中使用 each_key,因此您收到未初始化错误。

    复制一下

        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 方法中

    【讨论】:

    • 使用您的代码,即使没有意图,仅按搜索按钮,应用程序就会崩溃:java.lang.RuntimeException: java.lang.NoSuchMethodException: [class android.view.查看]
    • 没关系,我修复了空指针异常。现在尝试做 onlick。我在 onclick 上放了一个 toast,它显示正确的位置。现在我不知道如何使用意图.putExtra
    • 请帮帮我兄弟..当没有任何东西可以附加到适配器时,我似乎无法使用 putExtra。我知道如何使用自定义适配器和回收器适配器以老式方式执行此操作。但是我不知道如何使用 firebaserecycler @parag pawar 来做到这一点
    • 您的问题是什么?如何使用 putExtra 或将适配器附加到 recyclerview...还显示日志实际上是什么错误
    • 如何使用 putExtra 为每个项目的下一个活动显示更多详细信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    相关资源
    最近更新 更多