ImageView в адаптере по какой-то причине является нулевым - PullRequest
0 голосов
/ 20 июня 2019

Так, в методе getView адаптера, когда я пытаюсь получить указатель на ImageView, который находится на макете, указатель равен нулю

Это класс адаптера:

public class PostAdapter extends ArrayAdapter<PostClass> {

    private Context context;
    private int resource;
    private ArrayList<PostClass> objects;
    private HashMap<String, String> poster = new HashMap<>();


    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference ref = database.getReference();
    DatabaseReference usersReference = ref.child("users");

    //DatabaseReference eventsReference = ref.child("Events");


    public PostAdapter(Context context, int resource, ArrayList<PostClass> objects) {
        super(context, resource, objects);
        this.context = context;
        this.resource = resource;
        this.objects = objects;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        String postId = objects.get(position).getPostId();
        LayoutInflater inflater = LayoutInflater.from(context);

        convertView = inflater.inflate(resource, parent, false);


        ImageView postImage = convertView.findViewById(R.id.postImgShow);
        TextView goingTxt = convertView.findViewById(R.id.postGoing);
        TextView description = convertView.findViewById(R.id.postDescriptionShow);
        ImageView posterImage = convertView.findViewById(R.id.publisherPic);
        TextView posterName = convertView.findViewById(R.id.publisherName);
        ImageView joinSignal = convertView.findViewById(R.id.joinSignal);

        if(postImage == null){
            Toast.makeText(context, "Is Null!!!!!!!!!!", Toast.LENGTH_SHORT).show();
            Log.i("IsNull","yes");
        }

        publisherInfo(position, posterImage, posterName);

        Picasso.get().load(objects.get(position).getPostImage()).fit().centerCrop().into(postImage);
        goingTxt.setText(objects.get(position).getGoing() + " going");
        description.setText(objects.get(position).getPostDescription());
        boolean bool = viewerGoing(postId);
        if (bool)
            joinSignal.setImageResource(R.drawable.ic_added);
        return convertView;
    }


    private void publisherInfo(final int position, final ImageView posterImage, final TextView posterName) {

        DatabaseReference posterRef;
        posterRef = usersReference.child(objects.get(position).getPostPublisher());
        posterRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                UserClass thisPoster = dataSnapshot.getValue(UserClass.class);


                Picasso.get().load(thisPoster.getPic()).fit().centerCrop().into(posterImage);
                posterName.setText(thisPoster.getName());

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                System.out.println("The read failed: " + databaseError.getCode());
            }
        });

    }

    private boolean viewerGoing(String postId) {
        boolean ret = false;
        return ret;
    }
}

И это фрагмент списка, который я хочу изменить:

public class PostsFragment extends Fragment {

    private FloatingActionButton fab;
    private ListView listView;
    private PostAdapter adapter;
    private ArrayList<PostClass> posts;

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

        View view = inflater.inflate(R.layout.posts_layout,container, false);
        posts = new ArrayList<>();
        fab = view.findViewById(R.id.fab);
        listView = view.findViewById(R.id.posts);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getActivity(), PostActivity.class);
                startActivity(intent);
            }
        });

        readPosts();
        adapter = new PostAdapter(getContext(), R.layout.posts_layout, posts);
        listView.setAdapter(adapter);
        return view;
    }
    private void readPosts(){
        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Posts");

        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                posts.clear();
                for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                    posts.add(snapshot.getValue(PostClass.class));
                }
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }
}

Когда я пытаюсь загрузить изображение в ImageView с помощью Picasso, он говорит, что цель является нулевой (а также я вижу в журнале, что она говорит, что да)

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Do:

    if (convertView == null) {
        LayoutInflater mInflater = (LayoutInflater)
                context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        convertView = mInflater.inflate(R.layout.posts_layout, null);
    }

Вместо:

    LayoutInflater inflater = LayoutInflater.from(context);

    convertView = inflater.inflate(resource, parent, false);

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

Это также предполагает, что R.layout.posts_layout является макетом элемента списка, а не макетом списка. Две разные вещи.

0 голосов
/ 20 июня 2019

onCreateView вызывается после создания фрагмента, чтобы вы могли создать его пользовательский интерфейс.

onViewCreated запускается после создания фрагмента и его родительского «представления».поэтому в onViewCreated обратном вызове вы должны выполнить инициализацию фрагмента.(Все, что требует создания родительской операции).

Подробнее см. Жизненный цикл фрагмента .

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