android - RecyclerView is loading items , but not scrolling. Onclick does not work either
问题描述
Recycler view loads items and images , but it does not scroll the bottom items properly, When I try touch scrolling , it drags down a bit and then rebounds back to top. The onlick I set on these buttons don't work either.
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 reference=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>
Please help. I need to finish my project in a few days. Thank you in advance
解决方案
Didn't have time to test this but here is what I think. you are setting up your recyclerView adapter every time the data changes in your onDataChange listener so you keep resetting your recyclerview. try taking the following code out of that listener and put it in the OnCreatView of your fragment right below getCatList().
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();
推荐阅读
- nlp - 如何在词嵌入中插入信息?
- python - sqlite3.InterfaceError:错误绑定参数 0 - 可能是不支持的类型?
- python - 在python中将字符串与文本文件进行比较
- html - 如何使文本从表格单元格的底部开始?
- python - 层次嵌套字典创建新功能
- r - 根据最近的日期更新非缺失值
- python - 在函数中更新时python类属性不更新
- pandas - 熊猫:如何选择数据框类型为列表的列?
- laravel - 为什么调用未定义的方法 Srmklive\PayPal\Services\PayPal::setExpressCheckout()
- java - Take a number (1 to 10 length) transform it to indexes and base of this indexes retrieve the specific Strings from an array in Java