Хочу использовать представление переработчика во фрагменте. Создал адаптер, когда я устанавливаю адаптер, он показывает мне ошибку

#java #android

#java #Android

Вопрос:

Я хочу создать приложение, с помощью которого я могу сгенерировать бизнес-карту. Поэтому я использую панель навигации. Для навигации по меню я использую класс fragment для каждого из меню и соответствующий XML-макет. В одном из макетов я хочу показать вид моей карты внутри recyclerview.

MycardFragment.java (Это класс fragment, в котором я хочу показать recyclerview)

 package com.example.look.np.fragments;

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
import android.widget.TextView;

import com.example.look.np.R;
import com.example.look.np.models.Template;
import com.example.look.np.utils.FirebaseMethod;
import com.example.look.np.utils.RecyclerviewAdapter;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

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

public class MyCardFragment extends Fragment {

    private static final String TAG = "MyCardFragment";

    private Context mContext;

    private RecyclerView recyclerView;
    FirebaseDatabase database;
    DatabaseReference myRef ;
    List<Template> listdata;

    public MyCardFragment() {
       // Required empty public constructor
    }

    //i tried this section but it gimes me error
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mContext=context;
    }


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

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

        database = FirebaseDatabase.getInstance();
        myRef = database.getReference("template");

        // Initialize Template Model Class
        Template template = new Template();

        // ...
        // Lookup the Recycler view in fragment layout
        recyclerView = view.findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);
        // Attach the adapter to the recyclerview to populate items
        RecyclerviewAdapter adapter = new RecyclerviewAdapter(template,inflater.getContext());//>>>This is the error i'm facig
        // Set layout manager to position the items
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));


        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                // This method is called once with the initial value and again
                // whenever data at this location is updated.
                listdata = new ArrayList<Template>();
                for(DataSnapshot dataSnapshot1 :dataSnapshot.child("template").getChildren()){

                    Template value = dataSnapshot1.getValue(Template.class);
                    Template fire = new Template();

                    String name = value.getP_name();
                    String desig = value.getP_designation();
                    String email = value.getP_email();
                    String phone = value.getP_phone();
                    String address = value.getC_address();
                    String c_name = value.getC_name();

                    fire.setP_name(name);
                    fire.setP_designation(desig);
                    fire.setP_email(email);
                    fire.setP_phone(phone);
                    fire.setC_name(c_name);
                    fire.setC_address(address);

                    listdata.add(fire);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                // Failed to read value
                Log.w("Hello", "Failed to read value.", databaseError.toException());
            }
        });

        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
    }
}
  

Я также создал адаптер для представления recycler, когда я хочу установить адаптер в класс fragment, он показывает ошибку. Для этого требуется контекст и список. Для контекста я добавляю getActivity () bMycardFragment.java
(Это класс fragment, в котором я хочу показать recyclerview)

 package com.example.look.np.fragments;

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
import android.widget.TextView;

import com.example.look.np.R;
import com.example.look.np.models.Template;
import com.example.look.np.utils.FirebaseMethod;
import com.example.look.np.utils.RecyclerviewAdapter;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

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

public class MyCardFragment extends Fragment {

    private static final String TAG = "MyCardFragment";

    private Context mContext;

    private RecyclerView recyclerView;
    FirebaseDatabase database;
    DatabaseReference myRef ;
    List<Template> listdata;

    public MyCardFragment() {
       // Required empty public constructor
    }

    //i tried this section but it gimes me error
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mContext=context;
    }


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

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

        database = FirebaseDatabase.getInstance();
        myRef = database.getReference("template");

        // Initialize Template Model Class
        Template template = new Template();

        // ...
        // Lookup the Recycler view in fragment layout
        recyclerView = view.findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);
        // Attach the adapter to the recyclerview to populate items
        RecyclerviewAdapter adapter = new RecyclerviewAdapter(template,inflater.getContext());//>>>This is the error i'm facig
        // Set layout manager to position the items
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));


        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                // This method is called once with the initial value and again
                // whenever data at this location is updated.
                listdata = new ArrayList<Template>();
                for(DataSnapshot dataSnapshot1 :dataSnapshot.child("template").getChildren()){

                    Template value = dataSnapshot1.getValue(Template.class);
                    Template fire = new Template();

                    String name = value.getP_name();
                    String desig = value.getP_designation();
                    String email = value.getP_email();
                    String phone = value.getP_phone();
                    String address = value.getC_address();
                    String c_name = value.getC_name();

                    fire.setP_name(name);
                    fire.setP_designation(desig);
                    fire.setP_email(email);
                    fire.setP_phone(phone);
                    fire.setC_name(c_name);
                    fire.setC_address(address);

                    listdata.add(fire);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                // Failed to read value
                Log.w("Hello", "Failed to read value.", databaseError.toException());
            }
        });

        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
    }
}
  

MycardFragment.java
(Это класс fragment, в котором я хочу показать recyclerview)

 package com.example.look.np.fragments;

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
import android.widget.TextView;

import com.example.look.np.R;
import com.example.look.np.models.Template;
import com.example.look.np.utils.FirebaseMethod;
import com.example.look.np.utils.RecyclerviewAdapter;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

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

public class MyCardFragment extends Fragment {

    private static final String TAG = "MyCardFragment";

    private Context mContext;

    private RecyclerView recyclerView;
    FirebaseDatabase database;
    DatabaseReference myRef ;
    List<Template> listdata;

    public MyCardFragment() {
       // Required empty public constructor
    }

    //i tried this section but it gimes me error
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mContext=context;
    }


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

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

        database = FirebaseDatabase.getInstance();
        myRef = database.getReference("template");

        // Initialize Template Model Class
        Template template = new Template();

        // ...
        // Lookup the Recycler view in fragment layout
        recyclerView = view.findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);
        // Attach the adapter to the recyclerview to populate items
        RecyclerviewAdapter adapter = new RecyclerviewAdapter(template,inflater.getContext());//>>>This is the error i'm facig
        // Set layout manager to position the items
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));


        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                // This method is called once with the initial value and again
                // whenever data at this location is updated.
                listdata = new ArrayList<Template>();
                for(DataSnapshot dataSnapshot1 :dataSnapshot.child("template").getChildren()){

                    Template value = dataSnapshot1.getValue(Template.class);
                    Template fire = new Template();

                    String name = value.getP_name();
                    String desig = value.getP_designation();
                    String email = value.getP_email();
                    String phone = value.getP_phone();
                    String address = value.getC_address();
                    String c_name = value.getC_name();

                    fire.setP_name(name);
                    fire.setP_designation(desig);
                    fire.setP_email(email);
                    fire.setP_phone(phone);
                    fire.setC_name(c_name);
                    fire.setC_address(address);

                    listdata.add(fire);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                // Failed to read value
                Log.w("Hello", "Failed to read value.", databaseError.toException());
            }
        });

        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
    }
} 
  

У меня есть класс адаптера, который принимает контекст и список элементов. Теперь я хочу установить свой адаптер во фрагменте, передав context (getActivity() и List, но он показывает мне ошибку

     I tried getActivity() but it  show me error
    i also tried this
      @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            mContext=context;
        }





    //This is adapter class for my Recyclerview
    RecyclerAdater.java

package com.example.look.np.utils;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.example.look.np.R;
import com.example.look.np.models.Template;

import java.util.List;


public class RecyclerviewAdapter extends RecyclerView.Adapter<RecyclerviewAdapter.MyHolder>{

    // ... constructor and member variables

    // Usually involves inflating a layout from XML and returning the holder
    List<Template> listdata;
    Context context;

    public RecyclerviewAdapter(List<Template> listdata, Context context) {
        this.listdata = listdata;
        this.context = context;
    }

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

        // Inflate the custom layout
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview,parent,false);

        // Return a new holder instance
        MyHolder myHolder = new MyHolder(view);
        return myHolder;
    }


    public void onBindViewHolder(MyHolder holder, int position) {

        Template data = listdata.get(position);
        holder.pname.setText(data.getP_name());
        holder.pdesignation.setText(data.getP_designation());
        holder.pemail.setText(data.getP_email());
        holder.pphone.setText(data.getP_phone());
        holder.cname.setText(data.getC_name());
        holder.caddress.setText(data.getC_address());
    }

    @Override
    public int getItemCount() {
        //return listdata.size();
        int arr = 0;

        try{
            if(listdata.size()==0){
                arr = 0;
            }
            else{
                arr=listdata.size();
            }
        }catch (Exception e){
            e.printStackTrace();
        }

        return arr;

    }


    class MyHolder extends RecyclerView.ViewHolder{
        // Your holder should contain a member variable
        // for any view that will be set as you render a row
        TextView pname,caddress,pemail,pdesignation,pphone,cname;

        // We also create a constructor that accepts the entire item row
        // and does the view lookups to find each subview

        public MyHolder(View itemView) {
            // Stores the itemView in a public final member variable that can be used
            // to access the context from any ViewHolder instance.
            super(itemView);

            pname = (TextView) itemView.findViewById(R.id.txt_personName);
            caddress = (TextView) itemView.findViewById(R.id.txt_address);
            pemail = (TextView) itemView.findViewById(R.id.txt_email);
            pdesignation = (TextView) itemView.findViewById(R.id.txt_designation);
            pphone = (TextView) itemView.findViewById(R.id.txt_phone);
            cname = (TextView) itemView.findViewById(R.id.txt_companyName);

        }
    }
}
  

Комментарии:

1. Пожалуйста, поделитесь журналами ошибок

Ответ №1:

Следует отметить, не забудьте установить layoutManager в recyclerview и установить adapter .

 LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
layoutManager.setOrientation(LinearLayoutManager.VERTICAL
recyclerview.setLayoutManager(layoutManager);
recyclerview.setHasFixedSize(true);

recyclerviewAdapter adapter = new recyclerviewAdapterAdapter(listdata,getActivity());        

recyclerview.setAdapter(adapter);
  

Еще одна вещь, на которую следует обратить внимание в вашем коде, это:
В oncreateView() есть сетевой вызов (который выполняется в фоновом режиме). Прежде чем он выдаст результат, вызывается return view; .

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

Это можно решить, вызвав отдельный метод, такой как метод setRecyclerView() from onCreateView() . После получения результата фоновой операции вы можете настроить свой recyclerview, как указано выше.

Не забудьте вызвать adapter.notifydatasetchanged() метод.

Комментарии:

1. Спасибо, сэр. У меня есть еще один вопрос, если у вас есть время, пожалуйста, не стесняйтесь ответить на вопрос: Возможно ли передать макет нескольких карточек в представлении Recycler? N.B: В recyclerview я хочу добавить другой дизайн из другого cardview

2. Вместо того, чтобы передавать представление с несколькими картами, вы можете добиться этого, выполнив следующее. Включите все представление карты в один элемент recyclerview. В вашем списке должно быть какое-то поле, которое определяет, какое представление карты будет отображаться в представлении recycler. Сделайте видимость другого представления переработчика недоступной.

3. Спасибо, сэр, можете ли вы привести мне пример или любую полезную ссылку для достижения этой цели?