Search code examples
androidlistviewandroid-tabbed-activity

ArrayAdapter showing Error: Tabbed Activity and ListView


I am trying to create a Tabbed Activity which contains a List. I have created the Tabbed Activity and I want to create the list in the fragment. Each List Item contains 2 ImageViews and 4 TextViews. Therefore, I created a custom Class and a Custom ArrayAdapter. Here is the Code -

  1. Coins.java - This is the fragment of the tabbed Activity.

    package com.example.android.cotescol;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ListView;
    import java.util.ArrayList;
    public class Coins extends android.support.v4.app.Fragment{
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.currency_list, container, false);
    
            final ArrayList<CoinObject> coins = new ArrayList<Currency>();
    
            coins.add(new CoinObject(1, "India", 1947));
            coins.add(new CoinObject(1, "India", 1947));
    
            CoinAdapter itemsAdapter = new CoinAdapter(this, coins);
            ListView listView = (ListView) findViewById(R.id.list);
            listView.setAdapter(itemsAdapter);
    
            return rootView;
        }
    }
    
  2. CoinObject.java - It is a custom class in which each object contains all the details of the coin.

    package com.example.android.cotescol;
    
    import java.util.HashMap;
    import java.util.Locale;
    import java.util.Map;
    
    public class CoinObject {
    
        private final static int NO_IMAGE_AVAILABLE = R.drawable.nia;
        private final static String NOT_AVAILABLE = "Material Not Specified";
        private final static double NOT_KNOWN = 0.00;
    
        private int denomination;
        private String country;
        private String countryCode;
        private int year;
        private int obverseImageResourceId = NO_IMAGE_AVAILABLE;
        private int reverseImageResourceId = NO_IMAGE_AVAILABLE;
        private String material = NOT_AVAILABLE;
        private double diameter = NOT_KNOWN;
        private double weight = NOT_KNOWN;
        private double thickness = NOT_KNOWN;
        private double value = NOT_KNOWN;
    
        public CoinObject(int denomination, String country, int year, int obverseImageResourceId, int reverseImageResourceId , double diameter, double thickness, String material, double weight, double value) {
            this.denomination = denomination;
            this.country = country;
            this.year = year;
            this.obverseImageResourceId = obverseImageResourceId;
            this.reverseImageResourceId = reverseImageResourceId;
            this.diameter = diameter;
            this.thickness = thickness;
            this.material = material;
            this.weight = weight;
            this.value = value;
            this.countryCode = getCountryCode(country);
        }
    
        public CoinObject(int denomination, String country, int year, double diameter, double thickness, String material, double weight, double value) {
            this.denomination = denomination;
            this.country = country;
            this.year = year;
            this.diameter = diameter;
            this.thickness = thickness;
            this.material = material;
            this.weight = weight;
            this.value = value;
            this.countryCode = getCountryCode(country);
        }
    
        public CoinObject(int denomination, String country, int year) {
            this.denomination = denomination;
            this.country = country;
            this.year = year;
            this.countryCode = getCountryCode(country);
        }
    
        public String getCountryCode(String countryName) {
            // Get all country codes in a string array.
            String[] isoCountryCodes = Locale.getISOCountries();
            Map<String, String> countryMap = new HashMap<>();
            // Iterate through all country codes:
            for (String code : isoCountryCodes) {
                // Create a locale using each country code
                Locale locale = new Locale("", code);
                // Get country name for each code.
                String name = locale.getDisplayCountry();
                // Map all country names and codes in key - value pairs.
                countryMap.put(name, code);
            }
            // Get the country code for the given country name using the map.
            // Here you will need some validation or better yet
            // a list of countries to give to user to choose from.
            String countryCode = countryMap.get(countryName); // "NL" for Netherlands.  
    
            return countryCode;
        }
    
        public int getDenomination() { return denomination; }
        public int getYear() { return year; }
        public int getObverseImageResourceId() { return obverseImageResourceId; }
        public int getReverseImageResourceId() { return reverseImageResourceId; }
        public double getDiameter() { return diameter; }
        public double getWeight() { return weight; }
        public double getThickness() { return thickness; }
        public double getValue() { return value; }
        public String getCountry() { return country; }
        public String getCountryCode() { return countryCode; }
        public String getMaterial() { return material; }
    }
    
  3. CoinAdapter.java - It is a custom ArrayAdapter

    package com.example.android.cotescol;
    
    import android.content.Context;
    import android.support.annotation.NonNull;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import java.util.ArrayList;
    
    public class CoinAdapter extends ArrayAdapter<CoinObject>{
        public CoinAdapter(Context context, ArrayList<CoinObject> currencies) {
            super(context, 0, currencies);
        }
    
        @NonNull
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View listItemView = convertView;
            if (listItemView == null) {
                listItemView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false);
            }
    
            CoinObject currentCoinObject = getItem(position);
    
            TextView denominationTextView = (TextView) listItemView.findViewById(R.id.denomination_text_view);
            denominationTextView.setText(currentCoinObject.getDenomination());
    
            TextView countryTextView = (TextView) listItemView.findViewById(R.id.country_text_view);
            countryTextView.setText(currentCoinObject.getCountry() + "(" + currentCoinObject.getCountryCode() + ")");
    
            TextView yearTextView = (TextView) listItemView.findViewById(R.id.year_text_view);
            yearTextView.setText(currentCoinObject.getYear());
    
            ImageView obverseImageView = (ImageView) listItemView.findViewById(R.id.obverse_image_view);
            obverseImageView.setImageResource(currentCoinObject.getObverseImageResourceId());
    
            ImageView reverseImageView = (ImageView) listItemView.findViewById(R.id.reverse_image_view);
            reverseImageView.setImageResource(currentCoinObject.getReverseImageResourceId());
    
            return listItemView;
        }
    }
    

In the Coins.java file, I am getting an error while creating an Instance of the CoinAdapter class. Also the findViewById() is shown in red. Error Picture

It would be really helpful if someone guided me to do it the correct way. Thanks in Advance.


Solution

  • Replace:

    CoinAdapter itemsAdapter = new CoinAdapter(this, coins);
    

    With:

    CoinAdapter itemsAdapter = new CoinAdapter(getActivity(), coins);
    

    Replace:

    ListView listView = (ListView) findViewById(R.id.list);
    

    With:

    ListView listView = (ListView) rootView.findViewById(R.id.list);