java - 当我在 GridView 中使用 setOnItemClickListener 返回 null

标签 java android firebase gridview google-cloud-firestore

当我使用 setOnItemClickListener 获取 GridView 中点击项目的 ID 时出现问题返回 null。我尝试这样做是因为我想当用户单击一个项目时我从数据库中检索数据然后在另一个 fragment 中表示它所以有一个获取 id 的解决方案或者有另一种方法来处理它。非常感谢。

我使用适配器:

fragment .java

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.Toast;

import com.example.mohamed.osarelkheir.Adapters.Section_Adapter;
import com.example.mohamed.osarelkheir.First_Launch;
import com.example.mohamed.osarelkheir.Models.Section_Model;
import com.example.mohamed.osarelkheir.R;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.firestore.DocumentChange;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreException;
import com.google.firebase.firestore.Query;
import com.google.firebase.firestore.QuerySnapshot;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class Sections_Fragment extends Fragment {

    private GridView Dep_grid_View; //object from GridView (list) -Session Fragment
    private List<Section_Model> Dep_list; //Data Model Object
    private Section_Adapter section_adapter; //Adapter Object

    private FirebaseFirestore firebaseFirestore;
    private FirebaseAuth firebaseAuth;

    private String Dep_id;
    private String item;

    private DocumentSnapshot lastVisible; //to print the last ....

    //Empty Contractor
    public Sections_Fragment() {

    }

    private FragmentManager fragmentManager;


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

        View view = inflater.inflate(R.layout.section_fragment, container, false);

        Dep_grid_View = view.findViewById(R.id.gridSection);
        Dep_list = new ArrayList<>();

        firebaseAuth = FirebaseAuth.getInstance();
        firebaseFirestore = FirebaseFirestore.getInstance();


//        myList = Arrays.asList(section_models); //he create its own array list to view it as a templet data cooooool
        section_adapter = new Section_Adapter(getContext(), Dep_list);
        Dep_grid_View.setAdapter(section_adapter);


        //First Query
        Query firstQuery = firebaseFirestore.collection("Department");
        firstQuery.addSnapshotListener(getActivity(), new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@javax.annotation.Nullable QuerySnapshot snapshots, @javax.annotation.Nullable FirebaseFirestoreException e) {
//                Toast.makeText(getActivity(), "No", Toast.LENGTH_SHORT).show();

                for (DocumentChange doc : snapshots.getDocumentChanges()) {
//                    Toast.makeText(getActivity(), "NoO", Toast.LENGTH_SHORT).show();

                    if (doc.getType() == DocumentChange.Type.ADDED) {

//                        Toast.makeText(getActivity(), "No00", Toast.LENGTH_SHORT).show();

                        Dep_id = doc.getDocument().getId();

                        Toast.makeText(getActivity(), "Id" + Dep_id, Toast.LENGTH_SHORT).show();


                        // <<<<<<<<<<<<<GET DATA from DB >>>>>>>>>>>>>>>>>>
                        Section_Model section_model = doc.getDocument().toObject(Section_Model.class).withId(Dep_id);

                        //<<<<<<<<<<<<<<<then Put it in object of  BlogList >>>>>>>>>>>>>>
                        Dep_list.add(section_model);

                        section_adapter.notifyDataSetChanged();

                    }
                }
            }
        });


        Dep_grid_View.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

                 //it's return null 
                item = Dep_grid_View.getItemAtPosition(i).toString();

                printadminview();
            }
        });

        return view;
    }

    void printadminview() {
        Intent intent = new Intent(getContext(), First_Launch.class);
        intent.putExtra("value", 3);
        intent.putExtra("Dep_ID", item );
//        Toast.makeText(getActivity(), "pos " + pos, Toast.LENGTH_SHORT).show();
        getContext().startActivity(intent);
    }

}

.xml 文件

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <SearchView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:background="@drawable/item_background_manage"
            android:layout_marginTop="5dp"
            android:layout_marginEnd="5dp"
            android:layout_marginStart="5dp"
            android:layout_weight="1"
            android:queryHint="search"/>

    </LinearLayout>

    <GridView
        android:id="@+id/gridSection"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:numColumns="auto_fit"
        android:verticalSpacing="5dp"
        android:horizontalSpacing="3dp"
        android:layout_margin="8dp" />
</LinearLayout>

适配器类

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.example.mohamed.osarelkheir.First_Launch;
import com.example.mohamed.osarelkheir.Models.Section_Model;
import com.example.mohamed.osarelkheir.R;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.firestore.FirebaseFirestore;

import java.util.List;

public class Section_Adapter extends ArrayAdapter<Section_Model> { //1

    private Context mContext;
    private List<Section_Model> data;


    public Section_Adapter(Context mContext,List<Section_Model> data) {//2
        super(mContext,R.layout.item_section,data);
        this.mContext = mContext;
        this.data = data;
    }




      @Override
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
    View row = convertView;
    ViewHolder holder;
    if (row == null) {
        LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
        row = inflater.inflate(R.layout.item_section, parent, false);
        holder = new ViewHolder();
        holder.txtSectionName = row.findViewById(R.id.sectionName);
        holder.imageView = row.findViewById(R.id.imageSection);
        holder.imageIc = row.findViewById(R.id.ic_sec);
        row.setTag(holder);
        row.setTag(new Integer(position));

    } else {
        holder = (ViewHolder) row.getTag();
    }
    setView(holder, position);

    Section_Model model = getItem(position);
    String id = model.getId();
    Intent intent=new Intent(mContext, First_Launch.class);
            intent.putExtra("value",1);
            intent.putExtra("DepartmentId", id);
            mContext.startActivity(intent);

    return row;
}

    private void setView(ViewHolder holder, int position) {
        Section_Model section_model = data.get(position);

        holder.txtSectionName.setText(section_model.getSection_name());

        String downlaodUriImage = section_model.getSection_image();
        String DownloadUriLogo = section_model.getSection_icon();
        RequestOptions requestOptions = new RequestOptions();
        requestOptions.placeholder(R.drawable.logo);
        Glide.with(mContext).applyDefaultRequestOptions(requestOptions).load(downlaodUriImage).into(holder.imageView);
        Glide.with(mContext).load(DownloadUriLogo).apply(requestOptions.override(40,40)).into(holder.imageIc);



    }

        static class ViewHolder {
            TextView txtSectionName;
            ImageView imageView;
            ImageView imageIc;
        }


    }

最佳答案

要只获取id,你只需要使用下面的代码行。

firstQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            for (QueryDocumentSnapshot document : task.getResult()) {
                String documentId = document.getId();
                Log.d(TAG, documentId);
            }
        }
    }
});

除非需要实时获取数据,否则不需要使用addSnapshotListener。输出将是:

CIcg...
E30F...
rXY9...

如果需要获取被点击的item对应的id,只需使用getItem(position);

根据您的评论,最简单的方法是在您的 Section_Model 类中添加一个名为 id 的新属性,其中可以存储每个特定文档的 ID。因此,每次添加新文档时,该文档都将包含 id。使用 getItem(position) 将返回 Section_Model 类的对象。请看下面的代码:

Section_Model model = getItem(position);
String id = model.getId();

因此 model.getId() 将返回您将该文档添加到数据库时设置的对象的 ID。

关于java - 当我在 GridView 中使用 setOnItemClickListener 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50582750/

相关文章:

firebase - 将大量数据导入 Firebase Firestore

java - 想要 "dd/MM/yyyy HH:mm:ss.SS"格式的当前日期和时间

java - 读取联系人仅显示电子邮件存储中的联系人

java - 数据插入数据库android后如何顺序更改textview

firebase - 这个 firebase 规则是多余的吗?何时使用写入与验证?

android - 无法解决 : com. google.firebase :firebase-core:11. 2.0

Java 在字符串中看不到空格

java - 在java文件中使用密码的安全方法

android - DialogFragment 空白并在 Marshmallow 上变灰

android - 特定设备 androidx 中的搜索 View 问题