RecyclerView 正在加载 items ,但没有滚动。 Onclick 也不起作用
RecyclerView is loading items , but not scrolling. Onclick does not work either
Recycler 视图加载项目和图像,但它不能正确滚动底部项目,当我尝试触摸滚动时,它向下拖动一点然后反弹回顶部。我在这些按钮上设置的 onlick 也不起作用。
CategoryFragemt.java
public class CategoryFragment extends Fragment {
Data data;
private List<Category> categoryList = new ArrayList<>();
private RecyclerView recyclerView;
private CategoryAdapter mAdapter;
List<Category> catlist = new ArrayList<>();
FirebaseDatabase firebaseDatabase=FirebaseDatabase.getInstance();
DatabaseReference引用=firebaseDatabase.getReference();
public CategoryFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
// firebaseDatabase.getInstance();
View view = inflater.inflate(R.layout.fragment_category, container, false);
recyclerView = view.findViewById(R.id.category_rv);
recyclerView.setHasFixedSize(true);
data = new Data();
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemViewCacheSize(20);
// recyclerView.setItemAnimator(new DefaultItemAnimator());
getCatList();
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//you can set the title for your toolbar here for different fragments different titles
getActivity().setTitle("Category");
}
public List<Category> getCatList(){
reference = FirebaseDatabase.getInstance().getReference("Category");
reference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()){
Category b = dataSnapshot1.getValue(Category.class);
categoryList.add(b);
// Dialog.show();
}
mAdapter = new CategoryAdapter(getCatList(), getContext(), "Category");
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return categoryList;
}
}
CATEGORYADAPTER.jAVA
public class CategoryAdapter extends RecyclerView.Adapter<CategoryAdapter.MyViewHolder> {
List<Category> categoryList;
Context context;
String Tag;
public CategoryAdapter(List<Category> categoryList, Context context) {
this.categoryList = categoryList;
this.context = context;
}
public CategoryAdapter(List<Category> categoryList, Context context, String tag) {
this.categoryList = categoryList;
this.context = context;
Tag = tag;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {
View itemView;
if (Tag.equalsIgnoreCase("Home")) {
itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.row_home_category, parent, false);
} else {
itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.row_category, parent, false);
}
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull final MyViewHolder holder, int position) {
Category category = categoryList.get(holder.getAdapterPosition());
holder.title.setText(category.getTitle());
if (Tag.equalsIgnoreCase("Category")) {
Picasso.get()
.load(category.getImage())
.fit()
.centerInside()
.placeholder(R.drawable.cart)
.error(R.drawable.cauliflower)
.into(holder.imageView);
}
holder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context, ProductActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
if(holder.title.getText().toString().equalsIgnoreCase("dairy")){
Intent i = new Intent(context, ProductActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(i);
}
}
});
holder.title.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(context, ProductActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
if (Tag.equalsIgnoreCase("Home") && categoryList.size() < 6 && categoryList.size() > 3) {
return 3;
} else if (Tag.equalsIgnoreCase("Home") && categoryList.size() >= 6) {
return 6;
} else {
return categoryList.size();
}
}
public class MyViewHolder extends RecyclerView.ViewHolder {
ImageView imageView;
TextView title;
ProgressBar progressBar;
CardView cardView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.category_image);
title = itemView.findViewById(R.id.category_title);
progressBar = itemView.findViewById(R.id.progressbar);
cardView = itemView.findViewById(R.id.card_view);
}
}
}
category_fragment.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:background="@drawable/bg_3" />
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:background="@drawable/bg_2" />
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:background="@drawable/bg_1" />
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:background="@drawable/graphe" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#99FFFFFF">
</RelativeLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/category_rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</androidx.recyclerview.widget.RecyclerView>
row_category.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.cardview.widget.CardView
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
app:cardCornerRadius="15dp"
app:cardElevation="4dp"
app:cardUseCompatPadding="true">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp">
<ImageView
android:id="@+id/category_image"
android:layout_width="90dp"
android:layout_height="90dp"
android:scaleType="fitXY" />
<ProgressBar
android:id="@+id/progressbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true" />
<TextView
android:id="@+id/category_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerInParent="true"
android:text="Food"
android:textSize="18dp"
android:textStyle="bold" />
</RelativeLayout>
</androidx.cardview.widget.CardView>
请帮忙。我需要在几天内完成我的项目。提前谢谢你
没有时间对此进行测试,但这是我的想法。
每次 onDataChange 侦听器中的数据发生变化时,您都会设置 recyclerView 适配器,因此您会不断重置 recyclerview。
尝试从该侦听器中取出以下代码并将其放在 getCatList() 正下方的片段的 OnCreatView 中。
mAdapter = new CategoryAdapter(getCatList(), getContext(), "Category");
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
还要检查 </RecyclerView>
.
下面的末尾缺少根 </RelativeLayout>
如果只是提问时的错误请忽略
同样勾选holder.title.getText().toString()
的值,根据标题提供点击功能。我认为这是导致问题的原因。
而不是 holder.title.getText().toString()
使用你给条件 category.getTitle()
Recycler 视图加载项目和图像,但它不能正确滚动底部项目,当我尝试触摸滚动时,它向下拖动一点然后反弹回顶部。我在这些按钮上设置的 onlick 也不起作用。
CategoryFragemt.java
public class CategoryFragment extends Fragment {
Data data;
private List<Category> categoryList = new ArrayList<>();
private RecyclerView recyclerView;
private CategoryAdapter mAdapter;
List<Category> catlist = new ArrayList<>();
FirebaseDatabase firebaseDatabase=FirebaseDatabase.getInstance(); DatabaseReference引用=firebaseDatabase.getReference();
public CategoryFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
// firebaseDatabase.getInstance();
View view = inflater.inflate(R.layout.fragment_category, container, false);
recyclerView = view.findViewById(R.id.category_rv);
recyclerView.setHasFixedSize(true);
data = new Data();
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemViewCacheSize(20);
// recyclerView.setItemAnimator(new DefaultItemAnimator());
getCatList();
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//you can set the title for your toolbar here for different fragments different titles
getActivity().setTitle("Category");
}
public List<Category> getCatList(){
reference = FirebaseDatabase.getInstance().getReference("Category");
reference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()){
Category b = dataSnapshot1.getValue(Category.class);
categoryList.add(b);
// Dialog.show();
}
mAdapter = new CategoryAdapter(getCatList(), getContext(), "Category");
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return categoryList;
}
}
CATEGORYADAPTER.jAVA
public class CategoryAdapter extends RecyclerView.Adapter<CategoryAdapter.MyViewHolder> {
List<Category> categoryList;
Context context;
String Tag;
public CategoryAdapter(List<Category> categoryList, Context context) {
this.categoryList = categoryList;
this.context = context;
}
public CategoryAdapter(List<Category> categoryList, Context context, String tag) {
this.categoryList = categoryList;
this.context = context;
Tag = tag;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {
View itemView;
if (Tag.equalsIgnoreCase("Home")) {
itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.row_home_category, parent, false);
} else {
itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.row_category, parent, false);
}
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull final MyViewHolder holder, int position) {
Category category = categoryList.get(holder.getAdapterPosition());
holder.title.setText(category.getTitle());
if (Tag.equalsIgnoreCase("Category")) {
Picasso.get()
.load(category.getImage())
.fit()
.centerInside()
.placeholder(R.drawable.cart)
.error(R.drawable.cauliflower)
.into(holder.imageView);
}
holder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context, ProductActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
if(holder.title.getText().toString().equalsIgnoreCase("dairy")){
Intent i = new Intent(context, ProductActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(i);
}
}
});
holder.title.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(context, ProductActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
if (Tag.equalsIgnoreCase("Home") && categoryList.size() < 6 && categoryList.size() > 3) {
return 3;
} else if (Tag.equalsIgnoreCase("Home") && categoryList.size() >= 6) {
return 6;
} else {
return categoryList.size();
}
}
public class MyViewHolder extends RecyclerView.ViewHolder {
ImageView imageView;
TextView title;
ProgressBar progressBar;
CardView cardView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.category_image);
title = itemView.findViewById(R.id.category_title);
progressBar = itemView.findViewById(R.id.progressbar);
cardView = itemView.findViewById(R.id.card_view);
}
}
}
category_fragment.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:background="@drawable/bg_3" />
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:background="@drawable/bg_2" />
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:background="@drawable/bg_1" />
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:background="@drawable/graphe" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#99FFFFFF">
</RelativeLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/category_rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</androidx.recyclerview.widget.RecyclerView>
row_category.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.cardview.widget.CardView
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
app:cardCornerRadius="15dp"
app:cardElevation="4dp"
app:cardUseCompatPadding="true">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp">
<ImageView
android:id="@+id/category_image"
android:layout_width="90dp"
android:layout_height="90dp"
android:scaleType="fitXY" />
<ProgressBar
android:id="@+id/progressbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true" />
<TextView
android:id="@+id/category_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerInParent="true"
android:text="Food"
android:textSize="18dp"
android:textStyle="bold" />
</RelativeLayout>
</androidx.cardview.widget.CardView>
请帮忙。我需要在几天内完成我的项目。提前谢谢你
没有时间对此进行测试,但这是我的想法。 每次 onDataChange 侦听器中的数据发生变化时,您都会设置 recyclerView 适配器,因此您会不断重置 recyclerview。 尝试从该侦听器中取出以下代码并将其放在 getCatList() 正下方的片段的 OnCreatView 中。
mAdapter = new CategoryAdapter(getCatList(), getContext(), "Category");
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
还要检查 </RecyclerView>
.
下面的末尾缺少根 </RelativeLayout>
如果只是提问时的错误请忽略
同样勾选holder.title.getText().toString()
的值,根据标题提供点击功能。我认为这是导致问题的原因。
而不是 holder.title.getText().toString()
使用你给条件 category.getTitle()