适配器中的自定义方法无法在android中解析

时间:2016-07-13 15:28:23

标签: android

我在适配器类中有2个方法。

addValues(brandMap);
setBrandMap(brandMap);

我试图在异步调用后调用。但是,编译器抱怨它无法解析这些方法。有什么问题?

这是完整的课程。

public class FragmentBrandList extends ListFragment {

    private String TAG =  getClass().getSimpleName();
    private Map<String, Brand> brandMap = new ConcurrentHashMap<>();
    private RecyclerView.Adapter adapter;
    private FirebaseDatabase database = FirebaseDatabase.getInstance();
    private RecyclerView recyclerView;

    private Query query = database.getReference("brands").orderByChild("name");

    public FragmentBrandList() {
    }

    public static FragmentBrandList newInstance(int num) {
        FragmentBrandList f = new FragmentBrandList();
        // Supply num input as an argument.
        Bundle args = new Bundle();
        args.putInt("num", num);
        f.setArguments(args);

        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.recycler_list, container, false);
        recyclerView = (RecyclerView) v.findViewById(R.id.recycler_view);

        RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getActivity(), 3);
        RecyclerView.setLayoutManager(mLayoutManager);
        adapter = new FragmentBrandList.MyAdapter(Utility.getBrandMap(), getActivity());
        recyclerView.setAdapter(adapter);

        recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new ClickListener() {

            @Override
            public void onClick(View view, int position) {
                Brand brand = Utility.getBrands().get(position);
                Intent intent = new Intent(getActivity(), ActivityProductList.class);
                intent.putExtra("BrandId", brand.getId());
                startActivity(intent);
            }

            @Override
            public void onLongClick(View view, int position) {

            }
        }));

        query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
                    Brand brand = dataSnapshot1.getValue(Brand.class);
                    brandMap.put(brand.getId(), brand);
                }
                Utility.setBrandMap(brandMap);

                adapter.addValues(brandMap);
                adapter.setBrandMap(brandMap);
            }

            @Override
            public void onCancelled(DatabaseError error) {
                // Failed to read value
                Log.w(TAG, "Failed to read value.", error.toException());
                Utility.displayToast("Failed to read value." + error.toException());
            }
        });
        return v;
}

适配器类

private class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

        private List<Brand> brandList = new ArrayList<>();
        private Context context;

        public class MyViewHolder extends RecyclerView.ViewHolder {
            ImageView imageView;
            public MyViewHolder(View view) {
                super(view);
                imageView = (ImageView) view.findViewById(R.id.thumbnail);
            }
        }

        public MyAdapter(Map<String, Brand> brands, Context context) {
        //public MyAdapter(List<Brand> brands, Context context) {
            this.brandList = new ArrayList<>(brandMap.values());
            //this.brandList = brands;
            this.context = context;
        }

        public void setBrandMap(Map<String, Brand> brandMap){
            this.brandList = new ArrayList<>(brandMap.values());
            notifyDataSetChanged();
        }

        public void addValues(Map<String, Brand> brands){
            brandList.clear();
            brandList.addAll(brands.values());
            notifyDataSetChanged();
        }


        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View itemView = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.card_brand, parent, false);

            return new MyViewHolder(itemView);
        }

        @Override
        public void onBindViewHolder(MyViewHolder holder, int position) {
            if (brandList != null && brandList.size() > 0) {
                Brand brand = brandList.get(position);
                Glide.with(context).load(String.valueOf(brand.getImage()))
                        .error(R.drawable.placeholder)
                        .placeholder(R.drawable.placeholder)
                        .into(holder.imageView);
            }
        }

        @Override
        public int getItemCount() {
            return brandList.size();
        }
}

2 个答案:

答案 0 :(得分:1)

您已将适配器字段声明为:

private RecyclerView.Adapter adapter;

这意味着无论您在何处使用它,您都会将其视为RecyclerView.Adapter,它没有自定义方法。你赋予RecyclerView.Adapter的子类有额外的方法并不重要。这是因为你可能已经为那里分配了一个没有这些方法的不同子类。

如果要使用自定义方法,请将声明更改为:

private MyAdapter adapter;

然后,您可以使用MyAdapter中声明的所有方法,并继承自超类。权衡是你不能指定RecyclerView.Adapter的任何其他子类,但是由于编译器可以知道你总是可以使用额外的方法。

答案 1 :(得分:1)

问题在于这一行。

private RecyclerView.Adapter adapter;

由于您在Base引用中持有自定义适配器对象,因此您无法看到自定义适配器的那些方法。将引用更改为自定义适配器的类型,它应该可以正常工作。