代码之家  ›  专栏  ›  技术社区  ›  user1788736

在Android中,如何将多个ArrayList传递给BaseAdapter?

  •  0
  • user1788736  · 技术社区  · 8 年前

    我正在尝试将一些动态数据传递给 BaseAdapter 将其显示在 listview .(使用 ArrayList ),我的当前代码给出以下错误:

    错误:

    error: cannot find symbol variable ArrayList
    error: cannot find symbol variable String
    

    指向这部分代码(ArrayList<String>):

    CustomAdapter customAdapter = new CustomAdapter(getApplicationContext(), ArrayList<String> NameArrayList, ArrayList<String> IconArrayList);
    

    我检查了Arraylist的大小,并使用int itemCount=IconArrayList发现IconArrayList和NameArrayList不是空的。大小();

    然而,如果我将以下静态字符串数组传递给Baseadapter,那么它会在listview上显示数据!

    String NameArrayList[] = {"USA", "China", "australia", "Portugle", "Norway", "NewZealand"};
    String IconArrayList[] = {"http://awebsite.com/icons/usa.png", "http://awebsite.com/icons/china.png", "http://awebsite.com/icons/australia.png", "http://awebsite.com/icons/portugle.png", "http://awebsite.com/icons/norway.png", "http://awebsite.com/icons/new_zealand.png"};
    
    CustomAdapter customAdapter = new CustomAdapter(getApplicationContext(), NameArrayList, IconArrayList);
    

    你们能帮我修复以上错误,并将arraylist成功传递给baseAdapter,让它显示出来吗。提前谢谢。

    主要活动。java:

    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.ListView;
    
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.Toast;
    
    import android.os.StrictMode;
    import android.os.StrictMode.ThreadPolicy.Builder;
    
    import java.io.InputStreamReader;
    
    import java.net.URL;
    import java.net.HttpURLConnection;
    import java.io.OutputStream;
    import java.io.BufferedReader;
    
    import java.util.ArrayList;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            sendGetRequest();
    
         }
    
    
    public String sendGetRequest() {
    
             String NEW_ICON = "icon";
    
    
            ArrayList<String> IconArrayList =new ArrayList<String>();
            ArrayList<String> NameArrayList =new ArrayList<String>();
            ArrayList<String> UrlArrayList =new ArrayList<String>();
    
    
            try {
    
                StrictMode.setThreadPolicy(new Builder().permitAll().build());
    
                HttpURLConnection myURLConnection = (HttpURLConnection) new URL("http://awebsite.com/test/test.php").openConnection();
    
    
                myURLConnection.setReadTimeout(60000);
                myURLConnection.setConnectTimeout(60000);
                myURLConnection.setRequestMethod("GET");
                myURLConnection.setUseCaches(false);
                myURLConnection.setDoInput(true);
                myURLConnection.setDoOutput(true);
                myURLConnection.setRequestProperty("Content-Type", "html");
                myURLConnection.setRequestProperty("User-Agent", "Dalvik/2.1.0 (Linux; U; Android 6.0;)");
    
                OutputStream os = myURLConnection.getOutputStream();
    
                os.close();
    
                myURLConnection.connect();
    
                BufferedReader in = new BufferedReader(new InputStreamReader(myURLConnection.getInputStream()));
    
    
                StringBuffer sb = new StringBuffer();
    
                String line;
    
    
                while ((line = in.readLine()) != null) {
    
                    sb.append(line);
                    sb.append("\\n");
                }
                in.close();
    
    
    
                String linesArray[] = sb.toString().split("#MYLIST:");
    
                for (int i = 0; i < linesArray.length; i++) {
                    String currLine = linesArray[i];
    
    
                    String[] dataArray = currLine.split(",");
    
                    if (dataArray[0].contains(NEW_ICON)) {
    
                       String s =dataArray[0];
    
                        s = s.substring(s.indexOf("(") + 1);
                        s = s.substring(0, s.indexOf(")"));
    
    
                        IconArrayList.add(s);
    
    
    
                        if (dataArray[1].contains("http://")) {
                            String[] split = dataArray[1].split("http://");
                            String name = split[0];
                            String url = split[1];
                            url ="http://"+url;
    
                            //adding name and url to arraylist
                            NameArrayList.add(name);
                            UrlArrayList.add(url);
                          }
    
    
                    }
    
    
    
                }// end of for loop
    
                //showing array list total
                int itemCount = IconArrayList.size();
                int itemCount2 = NameArrayList.size();
                int itemCount3 = UrlArrayList.size();
    
    
                ListView simpleList;
                simpleList = (ListView) findViewById(R.id.simpleListView);
                CustomAdapter customAdapter = new CustomAdapter(getApplicationContext(), ArrayList<String> NameArrayList, ArrayList<String> IconArrayList);
                simpleList.setAdapter(customAdapter);
    
    
            } catch (Exception e) {
    
            }
            return null;
    
        }
    

    基本适配器:

    public class CustomAdapter extends BaseAdapter {
        Context context;
        String countryList[];
    
        String flags[];
    
        LayoutInflater inflter;
    
        public CustomAdapter(Context applicationContext, String[] countryList, String[] flags) {
            this.context = context;
            this.countryList = countryList;
            this.flags = flags;
            inflter = (LayoutInflater.from(applicationContext));
        }
    
        @Override
        public int getCount() {
            return countryList.length;
        }
    
        @Override
        public Object getItem(int i) {
            return null;
        }
    
        @Override
        public long getItemId(int i) {
            return 0;
        }
    
        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            view = inflter.inflate(R.layout.activity_listview, null);
            TextView country = (TextView) view.findViewById(R.id.textView);
            ImageView icon = (ImageView) view.findViewById(R.id.icon);
            country.setText(countryList[i]);
    
            Picasso.with(view.getContext())
                    .load(flags[i])
                    //.resize(50,50)
                    .into(icon);
    
            return view;
        }
    }
    
    4 回复  |  直到 8 年前
        1
  •  5
  •   IntelliJ Amiya    8 年前

    您正在发送 WRONG TYPE

    CustomAdapter customAdapter = new CustomAdapter(getApplicationContext(), ArrayList<String> NameArrayList, ArrayList<String> IconArrayList);
    

    会的

     CustomAdapter customAdapter = new CustomAdapter(getApplicationContext(),  NameArrayList,  IconArrayList);
    

    那么,你的 Constructor 将

    ArrayList<String> countryList;
    ArrayList<String> flags;
    
    public CustomAdapter(Context applicationContext,ArrayList<String> countryListOBJ, ArrayList<String> flagsOBJ) {
            this.context = context;
            this.countryList = countryListOBJ;
            this.flags = flagsOBJ;
            inflter = (LayoutInflater.from(applicationContext));
        }
    

    然后

     @Override
        public int getCount() {
            return countryList.size();
        }
    
        2
  •  2
  •   ADM    8 年前

    这不是将多个属性传递给任何类的方法。你应该用一个 波乔 班下面是一个例子。

    class CountryModel{
        public String countryName;
        public String countryFlag;
    
        public CountryModel(String countryName, String countryFlag) {
            this.countryName = countryName;
            this.countryFlag = countryFlag;
        }
    }
    

    然后将数据解析为该模型对象的集合。下面是一个例子。

     ArrayList<CountryModel> countryList=new ArrayList<>();
     countryList.add(new CountryModel("Norway","NorwayflagUrl"));
     countryList.add(new CountryModel("Iceland","IcelandflagUrl"));
     countryList.add(new CountryModel("Denmark","DenmarkflagUrl"));
    

    然后设置适配器。在这种情况下,您需要修改适配器。

    ListView simpleList = (ListView) findViewById(R.id.simpleListView);
            CustomAdapter customAdapter = new CustomAdapter(getApplicationContext(), countryList);
            simpleList.setAdapter(customAdapter);
    

    您可以按以下方式修改适配器。

     public class CustomAdapter extends BaseAdapter {
        Context context;
       ArrayList<CountryModel> countryList;
    
        LayoutInflater inflter;
    
        public CustomAdapter(Context applicationContext, ArrayList<CountryModel> countryList) {
            this.context = context;
            this.countryList = countryList;
            inflter = (LayoutInflater.from(applicationContext));
        }
    
        @Override
        public int getCount() {
            return countryList.size();
        }
    
        @Override
        public Object getItem(int i) {
            return countryList.get(i);
        }
    
        @Override
        public long getItemId(int i) {
            return i;
        }
    
        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            view = inflter.inflate(R.layout.activity_listview, null);
            TextView country = (TextView) view.findViewById(R.id.textView);
            ImageView icon = (ImageView) view.findViewById(R.id.icon);
            country.setText(countryList.get(i).countryName);
    
            Picasso.with(view.getContext())
                    .load(countryList.get(i).countryFlag)
                    //.resize(50,50)
                    .into(icon);
            return view;
        }
    }
    
        3
  •  2
  •   AGM Tazim    8 年前

    1. 您在上使用了字符串数组 CustomAdapter 的 constructor . 但你通过了 ArrayList<String> 从…起 Activity 班所以做这些 ArrayList 在…上 自定义适配器 -

        private ArrayList<String> NameArrayList;
        private ArrayList<String> IconArrayList;
    
        public CustomAdapter(getApplicationContext(), ArrayList<String> NameArrayList, ArrayList<String> IconArrayList) {
            this.NameArrayList= NameArrayList;
            this.IconArrayList= IconArrayList;
            inflter = (LayoutInflater.from(applicationContext));
        }
    

    2. 您正在通过API调用从服务器获取数据 MainThread . 尝试将这部分保持在单独的线程上以获得更好的性能(有时由于连接速度慢或处理时间长,您无法从服务器获取任何数据)。并使用处理程序在这些线程之间进行通信,因为您需要检测何时完成api调用并成功获取数据。 或者你可以使用任何第三方 AndroidNetworking 线程安全网络调用库。

        4
  •  0
  •   Ritu Suman Mohanty    8 年前

    1.变更

    CustomAdapter CustomAdapter=new CustomAdapter(getApplicationContext(),ArrayList NameArrayList,ArrayList IconArrayList);

    到这个

    CustomAdapter customAdapter = new CustomAdapter(getApplicationContext(),  NameArrayList,  IconArrayList);
    

    2.变更

     @Override
    public Object getItem(int i) {
        return null;
    }
    
    @Override
    public long getItemId(int i) {
        return 0;
    }
    

    到这个

    public Object getItem(int i) {
        return i;
    }
    
    public long getItemId(int i) {
        return i;
    }