当前位置: 首页 > 知识库问答 >
问题:

如何在一个listview中显示两个List和ArrayList?

吕修筠
2023-03-14

我有一个ApplicationInfo类型的列表和另一个String类型的ArrayList。我想在listView中列出这两者。我可以将ArrayAdapter(ApplicationInfo)和Array适配器(String)扩展到ApplicationAdapter吗。班这是我当前的代码,只显示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;
    }

}

所有应用程序活动.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 Class中更改了我的代码,如下所示

    @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);
    }

我的应用程序适配器. 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的新手。

    < li >当我有一个list和一个arrayList时,我定义HashMap(Integer,Object)合适吗? < li >我不知道构造html" target="_blank">函数和super()?super不接受myHash参数。

请告诉我如何做,请告诉我如何做,把代码发给我。提前感谢。

共有1个答案

谭凯
2023-03-14

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

看看官方文档:

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将不同的数据类型保存为整数、字符串和对象的值

 类似资料:
  • 问题内容: 我有一个Android应用程序,它显示一个网格视图,该网格视图显示: 1个 2 3 4 目前正在运行,但是我想显示网格的foreach行,其中2列具有2维数组的值(类似于ASP.Net中的GridView-作为数据源-)。 我想展示: 1 | 人1 2 | 人2 3 | 人3 4 | 人4 任何想法? 问题答案: 是否必须是网格视图?ListView可以工作吗? 我编写了一个ListV

  • 我正在编写一个掷骰子的程序。我对java还很陌生,因为我正在上课。我在这个程序的不同包中使用了多个类,我想弄清楚的是,在一个类中,对于我的包对OfDice,我在一个类中创建了对象对OfDice,die1和die2。现在我有了另一个包rollDice,我的目标是使用对OfDice类滚动两个骰子并显示滚动。我正在纠结的是如何准确地做到这一点。当我滚动骰子时,我的结果显示,就好像我只滚动了一个骰子一样。

  • 问题内容: 我想将两个唯一的警报附加到同一视图。当我使用下面的代码时,只有底部的警报起作用。 我正在macOS Catalina上使用Xcode 11的正式版本。 我希望在设置为true 时显示第一个警报,而在我设置为true时希望显示第二个警报。只有第二个警报显示其状态为true时,但第一个警报不执行任何操作。 问题答案: 第二个调用覆盖了第一个。您真正想要的是指示是否显示警报,以及应该从闭包后

  • 问题内容: 所以我正在一个项目中,我想要一个包含多个数据流的列表视图。我正在寻找的是这样的东西,但是所有这些都需要在一个列表视图中滚动。 我正在接收的数据流来自firebase,并且该变量是firebase集合的实例。我能够为单个流构建一个列表,所以我知道实例是正确的,我不想共享它,因为当前数据库规则处于测试模式。 此代码使我可以从单个流构建单个对象,并且可以按预期工作。 从这里开始,我觉得我有2

  • 我实现了一个GUI,它显示两个下拉菜单,您可以在其中选择要显示的两组不同的图形。但是,当我使用以下代码创建图形时: 然后我尝试更新情节(例如plt.tight_layout) 只有最后一个用“plt”调用的情节被更新。我如何编写我的代码,以便我可以引用两个图。 我还试图创建一个图,其中两个图形并排显示,但由于需要独立更新图形,我遇到了更多的问题。如果你能让它这样工作,太好了!我只是在想,修复之前的

  • 我正在使用Material-用户界面-Next,并试图以一种非常特殊的方式创建图像。 我有一些相当奇怪的问题。 1-3出现在1下面 2-2和3不会填满它们的整个空间(当突出显示时,无论图像如何,只有一半的内容空间被利用) 3-有时我会得到类似以下的东西: 为了便于参考,如果您遵循此链接,那么您将转到物料ui下一个GridList文档。在高级网格列表下,您将看到一个大图像和许多小图像。我的目标是将其