在回收站视图中出现onitemclick错误

时间:2020-01-28 08:22:42

标签: android android-recyclerview

我正在尝试使recyclerview中的项目可点击。我认为我在适配器类中所做的一切都正确,但是在主片段中,我得到了[{getActivity(),mCategory]下划线cAdapter = new CategoryAdapter(getActivity(), mCategory); 下面是Adapter类

public class CategoryAdapter extends RecyclerView.Adapter<CategoryAdapter.ImageViewHolder> {
    private Context pContext;
    private List<Category> mCategory;
    private OnItemClickListener conItemClickListener;

    public CategoryAdapter(Context pContext, List<Category> mCategory,OnItemClickListener onItemClickListener) {
        this.pContext = pContext;
        this.mCategory = mCategory;
        this.conItemClickListener = onItemClickListener;
    }

    public CategoryAdapter(ArrayList<Category> mCategory, OnItemClickListener onItemClickListener) {
        this.mCategory = mCategory;
        this.conItemClickListener = onItemClickListener;
    }

    @NonNull
    @Override
    public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);

        View v = inflater.inflate(R.layout.category_item, parent, false);
        return new ImageViewHolder(v, conItemClickListener);
    }

    @Override
    public void onBindViewHolder(@NonNull ImageViewHolder holder, int position) {
        Category categoryCur = mCategory.get(position);
        holder.cattitle.setText(categoryCur.getCatname());
        holder.cattitle.setBackgroundColor(Color.parseColor(categoryCur.getCatbg()));
        holder.iconWrapper.setBackgroundColor(Color.parseColor(categoryCur.getCatbg()));
        Picasso.get()
                .load(categoryCur.getCaticon())
                .placeholder(R.drawable.img_placeholder)
                .fit()
                .centerCrop()
               .into(holder.imgicon);
  }
    @Override
    public int getItemCount() {
        return mCategory.size();
    }

    class ImageViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView cattitle;
        ImageView imgicon;
        LinearLayout iconWrapper;
        OnItemClickListener itemClickListener;

        ImageViewHolder(@NonNull View itemView, OnItemClickListener itemClickListener) {
            super(itemView);
            cattitle = itemView.findViewById(R.id.cattName);
            imgicon = itemView.findViewById(R.id.catIcon);
            iconWrapper = itemView.findViewById(R.id.iconWrapper);
            this.itemClickListener = itemClickListener;
            itemView.setOnClickListener(this);
        }
        @Override
        public void onClick(View v) {
            itemClickListener.onItemClick(getAdapterPosition());
        }
    }

    public interface OnItemClickListener{
        void onItemClick(int position);
    }
}

下面是我的主页片段

public class HomeFragment extends Fragment implements CategoryAdapter.OnItemClickListener {
    private ViewPager mViewTop;
    private TabLayout mTabLayout;
    private static final int[] mResources = {
            R.drawable.axs,
            R.drawable.banner,
            R.drawable.e,
            R.drawable.unnamed,
            R.drawable.w,
            R.drawable.women,
            R.drawable.tes,
            R.drawable.qww,
            R.drawable.dribbble
    };
    private int count = 0;
    private RecyclerView nRecycleView, cRecyclerView;
    private PopularAdapter nAdapter;
    private CategoryAdapter cAdapter;
    private ArrayList<Category> mCategory;
    private List<Popular> mPopular;
    private DatabaseReference dbRef;
    private DatabaseReference logReference;
    private FirebaseAuth firebaseAuth;
    private FirebaseUser firebaseUser;

    public HomeFragment() {
        // Required empty public constructor
    }
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_home, container, false);
        mViewTop = view.findViewById(R.id.imgBanner);
        cRecyclerView = view.findViewById(R.id.category_view);
        nRecycleView = view.findViewById(R.id.recycler_view);
        loadEntries();
        cAdapter = new CategoryAdapter(mCategory,this);
        cRecyclerView.setAdapter(cAdapter);
        nAdapter = new PopularAdapter(mPopular);
        nRecycleView.setAdapter(nAdapter);
        nRecycleView.setHasFixedSize(true);
        nRecycleView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false));

        RecyclerView.LayoutManager cLayoutmanager = new GridLayoutManager(getActivity(), 2);
        cRecyclerView.setLayoutManager(cLayoutmanager);



        mViewTop.setAdapter(new TopPagerAdapter(getContext()));
        TabLayout tabLayout = view.findViewById(R.id.tabDots);
        tabLayout.setupWithViewPager(mViewTop, true);
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (count < 9) {
                            mViewTop.setCurrentItem(count);
                            count++;
                        } else {
                            count = 0;
                            mViewTop.setCurrentItem(count);
                        }
                    }
                });
            }
        }, 500, 3000);

        getActivity().getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        return view;
    }
   private void loadEntries() {
       mCategory = new ArrayList<>();
       dbRef = FirebaseDatabase.getInstance().getReference("Category");
       dbRef.addValueEventListener(new ValueEventListener() {
           @Override
           public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
               for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                   Category category = postSnapshot.getValue(Category.class);
                   mCategory.add(category);
               }
               cAdapter = new CategoryAdapter(getActivity(), mCategory);
               cRecyclerView.setAdapter(cAdapter);
           }
           @Override
           public void onCancelled(@NonNull DatabaseError databaseError) {
               Toast.makeText(getActivity(), databaseError.getMessage(), Toast.LENGTH_LONG).show();
           }
       });
       mPopular = new ArrayList<>();
       dbRef = FirebaseDatabase.getInstance().getReference("popular");
       dbRef.addValueEventListener(new ValueEventListener() {
           @Override
           public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
               for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                   Popular popular = postSnapshot.getValue(Popular.class);
                   mPopular.add(popular);
               }
               nAdapter = new PopularAdapter(getActivity(), mPopular);
               nRecycleView.setAdapter(nAdapter);
           }
           @Override
           public void onCancelled(@NonNull DatabaseError databaseError) {
               Toast.makeText(getActivity(), databaseError.getMessage(), Toast.LENGTH_LONG).show();
           }
       });
   }
    @Override
    public void onItemClick(int position) {
        Intent i = new Intent (getActivity(), SettingsActivity.class);
    }
    class TopPagerAdapter extends PagerAdapter {
        Context mContext;
        LayoutInflater mLayoutInflater;
        TopPagerAdapter(Context context) {
            mContext = context;
            mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        @Override
        public int getCount() {
            return mResources.length;
        }
        @Override
        public boolean isViewFromObject(@NotNull View view, @NotNull Object object) {
            return view == ((LinearLayout) object);
        }
        @NotNull
        @Override
        public Object instantiateItem(@NotNull ViewGroup container, int position) {
            View itemView = mLayoutInflater.inflate(R.layout.pager_item, container, false);

            ImageView imageView = (ImageView) itemView.findViewById(R.id.imageView);
            imageView.setImageResource(mResources[position]);

            container.addView(itemView);

            return itemView;
        }

        @Override
        public void destroyItem(@NotNull ViewGroup container, int position, @NotNull Object object) {
            container.removeView((LinearLayout) object);
        }
    }

}

此错误造成了很大的挫折,并且确实需要大力的帮助。

2 个答案:

答案 0 :(得分:0)

您已经在onCreateView中设置了适配器。

 cAdapter = new CategoryAdapter(mCategory,this)

现在在加载条目中不要这样做

cAdapter = new CategoryAdapter(getActivity(), mCategory);
               cRecyclerView.setAdapter(cAdapter);

替换这两行
cAdapter.notifyDataSetChanged();

如果您要删除只是错误的通行片段,就像这样,但这是不正确的做法。

cAdapter = new CategoryAdapter(HomeFragment.this, mCategory);

答案 1 :(得分:0)

如果我对它的理解正确,则希望使其可单击。使用界面,因此您可以无所不在。

在您的适配器中尝试类似的操作

私有OnItemClickListener mListener;

public interface OnItemClickListener {
    void onItemClick(int position);
}

public ExampleViewHolder(@NonNull View itemView){ ...

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               ....

                    }
                }
            }
        });

并在Activity中实现接口