#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. Спасибо, сэр, можете ли вы привести мне пример или любую полезную ссылку для достижения этой цели?