【问题标题】:How to display two List<ApplicationInfo> and ArrayList<String> in a listview?如何在列表视图中显示两个 List<ApplicationInfo> 和 ArrayList<String>?
【发布时间】:2015-04-10 13:58:14
【问题描述】:

我有一个 ApplicationInfo 类型的列表和另一个 String 类型的 ArrayList。我想在 listView 中列出这两个。我可以将 ArrayAdapter (ApplicationInfo) 和 ArrayAdapter(String) 都扩展到 ApplicationAdapter.class 吗?这是我当前的代码,仅显示 ApplicationInfo。

ApplicationAdapter.class

public class ApplicationAdapter extends ArrayAdapter<ApplicationInfo> {

    private List<ApplicationInfo> appsList = null;
    private Context context;
    private PackageManager packageManager;
    public ImageView addview;

    public ApplicationAdapter(Context context, int textViewResourceId, List<ApplicationInfo> appsList) {
        super(context, textViewResourceId, appsList);
        this.context = context;
        this.appsList = appsList;
        packageManager = context.getPackageManager();
    }

    @Override
    public int getCount() {
        return ((null != appsList) ? appsList.size() : 0);
    }

    @Override
    public ApplicationInfo getItem(int position) {
        return ((null != appsList) ? appsList.get(position) : null);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View view = convertView;
        if (null == view) {
            LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = layoutInflater.inflate(R.layout.snippet_list_row, null);
        }

        ApplicationInfo data = appsList.get(position);
        if (null != data) {
            TextView appName = (TextView) view.findViewById(R.id.app_name);
            TextView packageName = (TextView) view.findViewById(R.id.app_paackage);
            ImageView iconview = (ImageView) view.findViewById(R.id.app_icon);
            addview = (ImageView) view.findViewById(R.id.add_icon);

            appName.setText(data.loadLabel(packageManager));
            packageName.setText(data.packageName);
            iconview.setImageDrawable(data.loadIcon(packageManager));
            addview.setImageResource(R.drawable.ads);

        }
        return view;
    }

}

AllAppsActivity.class

public class AllAppsActivity extends ListActivity implements Serializable {

    private PackageManager packageManager = null;
    private List<ApplicationInfo> applist = null;
    private ApplicationAdapter listadaptor = null;
    public ImageView addview;
    public ArrayList<String> addblock_list;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mboolean = false;

        addblock_list = new ArrayList<String>(100);

        for(int i = 0; i < 100; i= i + 1) {
            addblock_list.add("addblock");
        }
    }

    @Override
    protected void onResume() {
        packageManager = getPackageManager();

        new LoadApplications().execute();
        super.onResume();
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        addview = (ImageView) v.findViewById(R.id.add_icon);

        ApplicationInfo app = applist.get(position);

        if(addblock_list.get(position).equals(app.packageName)) {
            addview.setImageResource(R.drawable.ads);
            addblock_list.set(position, "addblock");

            Toast.makeText(AllAppsActivity.this, "removed "+app.packageName,Toast.LENGTH_SHORT).show();
        } else {
            addview.setImageResource(R.drawable.adsblock);
            addblock_list.set(position, app.packageName);

            Toast.makeText(AllAppsActivity.this, "added "+app.packageName,Toast.LENGTH_SHORT).show();
        }
    }

    private List<ApplicationInfo> checkForLaunchIntent(List<ApplicationInfo> list) {
        ArrayList<ApplicationInfo> applist = new ArrayList<ApplicationInfo>();
        for (ApplicationInfo info : list) {
            try {
                if (null != packageManager.getLaunchIntentForPackage(info.packageName)) {
                    applist.add(info);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return applist;
    }

    private class LoadApplications extends AsyncTask<Void, Void, Void> {

        private ProgressDialog progress = null;

        @Override
        protected Void doInBackground(Void... params) {
            applist = checkForLaunchIntent(packageManager.getInstalledApplications(PackageManager.GET_META_DATA));
            listadaptor = new ApplicationAdapter(AllAppsActivity.this, R.layout.snippet_list_row, applist);
            return null;
        }

        @Override
        protected void onCancelled() {
            super.onCancelled();
        }

        @Override
        protected void onPostExecute(Void result) {
            setListAdapter(listadaptor);

            progress.dismiss();
            super.onPostExecute(result);
        }

        @Override
        protected void onPreExecute() {
            progress = ProgressDialog.show(AllAppsActivity.this, null, "Loading application info...");
            super.onPreExecute();
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }

    }

}

我查了一下互联网,我想我必须使用类似的东西:

我在 AllAppsActivity 类中更改了如下代码

    @Override
    protected Void doInBackground(Void... params) {
        applist = checkForLaunchIntent( packageManager.getInstalledApplications(PackageManager.GET_META_DATA));
        HashMap<Integer,Object> yourHash = new HashMap<Integer,Object>();
        yourHash.put(1,applist);
        yourHash.put(2,addblock_list);
        listadaptor = new ApplicationAdapter(AllAppsActivity.this,
                R.layout.snippet_list_row,yourHash);
        return null;



    }

@Override
    protected void onPostExecute(Void result) {
        setListAdapter(listadaptor);
        progress.dismiss();
        super.onPostExecute(result);
    }

我的 ApplicationAdapter.class

public class ApplicationAdapter extends ArrayAdapter<HashMap<Integer,Object>>{

private List<ApplicationInfo> appsList = null;
private Context context;
private PackageManager packageManager;
public ImageView addview;
private ArrayList<String> addblock_list;
private HashMap<Integer,Object> yourHash;



public ApplicationAdapter(Context context, int textViewResourceId,
        HashMap<Integer,Object> yourHash) {
    // TODO Auto-generated constructor stub
    super(context,textViewResourceId);

    this.context = context;
    this.yourHash = yourHash;
    packageManager = context.getPackageManager();


        List<ApplicationInfo> appsList = (List<ApplicationInfo> ) yourHash.get(1);
         ArrayList<String> addblock_list=( ArrayList<String> ) yourHash.get(2);




}


@Override
public ApplicationInfo getItem(int position) {
    return ((null != appsList) ? appsList.get(position) : null);
}..........

我是 android 和 java 新手。

  1. 当我有一个列表和一个 arrayList 时,我定义 HashMap(Integer ,Object) 是否合适?
  2. 我不知道构造函数和super()? super 没有接受 myHash 参数?

请告诉我如何执行此操作,请给我发送代码以启发我。提前致谢。

【问题讨论】:

    标签: android listview arraylist


    【解决方案1】:

    hashmap 是一种容器类型,可以保存不同的对象,按标签排序。 您可以在静态类上设置该哈希图以从任何地方访问它或通过参数将其传递给您的适配器(推荐)。

    查看官方文档:

    http://developer.android.com/reference/java/util/HashMap.html

    示例实现:

     // create an arrayList to store values
    35
            ArrayList<String> listOne = new ArrayList<String>();
    36
            listOne.add("Blue");
    37
            listOne.add("Black");
    38
            listOne.add("Brown");
    39
    
    40
            // create list two and store values
    41
            ArrayList<String> listTwo = new ArrayList<String>();
    42
            listTwo.add("Pink");
    43
            listTwo.add("Purple");
    44
    
    45
            // put values into map
    46
            multiMap.put("B color", listOne);
    47
            multiMap.put("P color", listTwo);
    

    在这里您可以找到解决不同类型问题的类似问题:

    Hashmap holding different data types as values for instance Integer, String and Object

    【讨论】:

    • 嘿我有一个列表和一个 ArrayList ,所以我将它定义为 HashMap HashMap 。没事吧?请检查问题回答我的疑问,我对其进行了编辑。提前致谢。
    • 当我有一个列表和一个数组列表时,我定义 HashMap(Integer ,Object) 是否合适? - 是的,它们都是对象,这是一种非常好的方法。我不知道构造函数和super()? super 没有采用 myHash 参数?构造函数是类的创建方法,super调用超类。你应该学习一点关于 java 中的类和继承的知识。
    • 感谢@CptEric。我将列表转换为 Arraylist 并创建了一个 HashMap(Integer,ArrayList) 并成功检索了 ApplicationAdapter.Class 中的两个数组。我遇到了另一个问题,请您检查一下。 link
    猜你喜欢
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 2017-05-08
    • 2014-09-08
    相关资源
    最近更新 更多