ArrayAdapter显示错误:选项卡式活动和ListView

时间:2017-02-24 16:17:09

标签: android listview android-tabbed-activity

我正在尝试创建一个包含List的Tabbed Activity。我创建了Tabbed Activity,我想在片段中创建列表。每个列表项包含2个ImageView和4个TextView。因此,我创建了一个自定义类和一个自定义ArrayAdapter。这是代码 -

  1. Coins.java - 这是标签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 - 这是一个自定义类,其中每个对象都包含硬币的所有细节。

    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 - 这是一个自定义的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;
        }
    }
    
  4. 在Coins.java文件中,我在创建CoinAdapter类的实例时遇到错误。 findViewById()也以红色显示。 Error Picture

    如果有人引导我以正确的方式去做,那将会非常有帮助。在此先感谢。

1 个答案:

答案 0 :(得分:0)

替换:

CoinAdapter itemsAdapter = new CoinAdapter(this, coins);

使用:

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

替换:

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

使用:

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