首页 > 解决方案 > 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

标签: androidfirebasearraylistandroid-recyclerviewandroid-adapter

解决方案


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();

推荐阅读