Android 如何在ListView中获取HashMap id值?

Android 如何在ListView中获取HashMap id值?,android,android-listview,Android,Android Listview,我试图将ImageList添加到我的应用程序中。我成功地添加了它。它显示了我被选中的银行的徽标。我通过HashMap添加了这一点,因为我想在单击日志图像时获取银行名称 但是我无法在onItemClick方法中获取银行名称。有人能帮我解决这个问题吗 这是我的活动代码 public void getImageData() { map = new HashMap<String, String>(); try { JSONObject jsonRespon

我试图将ImageList添加到我的应用程序中。我成功地添加了它。它显示了我被选中的银行的徽标。我通过HashMap添加了这一点,因为我想在单击日志图像时获取银行名称

但是我无法在onItemClick方法中获取银行名称。有人能帮我解决这个问题吗

这是我的活动代码

public void getImageData() {

    map = new HashMap<String, String>();

    try {
        JSONObject jsonResponse = new JSONObject(strJson1);
        JSONArray jsonMainNode = jsonResponse.optJSONArray("bank");

        for (int i = 0; i < jsonMainNode.length(); i++) {
            JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
            img_url = jsonChildNode.optString("logo");
            String test1 = img_test_url + img_url;
            bName = jsonChildNode.optString("name");
            map.put(bName, test1);

        }

        ItemsAdapter adapter = new ItemsAdapter(getApplicationContext(),map);
        list.setAdapter(adapter);

    } catch (JSONException e) {
        Toast.makeText(getApplicationContext(), "Connection Error...",
                Toast.LENGTH_LONG).show();
    }

    list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub

            HashMap<String, String> obj = (HashMap<String, String>) adapter.getItem(arg2);
            String name = (String) obj.get("bName");
            Log.d("Bank Name", name);

        }
    });
}

您应该创建一个银行对象,将其作为名称,将徽标作为属性,然后将银行对象的ArrayList传递给适配器。

您有两个错误。首先,您试图访问一个未初始化的成员类,因为您正在对成员的类作用域进行hding,并用局部作用域重新定义变量。这很容易解决。你可以用

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
第二个错误是您正在将
字符串
强制转换为
哈希映射
。您的
getItem
返回:

map.get(mKeys[position]);
由于您在自定义适配器中声明了
HashMap
getItem
实际上是返回一个字符串实例。所以你选错演员了。一旦您修复了NPE,您将得到一个
ClassCastException

编辑:为了达到你想要的,你应该从

  • 将表单HashMap切换到另一种类型、索引、基于顺序的集合。例如,它可以是一个
    ArrayList
    ,或者您可以创建自己的
    javabean
    。我假设您将使用
    类,id作为第一个元素,url作为第二个值
  • 相应地更改
    getView
    getItem
    。你可以摆脱

    String key = mKeys[position];
    String Value = getItem(position).toString();
    
  • 您的getItem将如下所示:

    @Override
    public Object getItem(int position) {
        return dataset.get(position);
    }
    
    而getView将从

       @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Pair<String, String> item = (Pair<String, String>)getItem(position);
            String Value = item.second;
        }
    
    @覆盖
    公共视图getView(int位置、视图转换视图、视图组父视图){
    Pair item=(Pair)getItem(position);
    字符串值=item.second;
    }
    
    在McClick中,您将得到类似的结果:

       list.setOnItemClickListener(new OnItemClickListener() {
    
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
           Pair<String, String> item = (Pair<String, String>)arg0.getItemAtPosition(arg2);
           String id = item.first;
        }
    
    list.setOnItemClickListener(新的OnItemClickListener(){
    @凌驾
    公共链接(AdapterView arg0、视图arg1、内部arg2、,
    长arg3){
    Pair item=(Pair)arg0.getItemAtPosition(arg2);
    字符串id=item.first;
    }
    

    正如@Raghunandan正确指出的那样,您应该将所有与网络/阻塞相关的操作放在不同的线程中。最简单的方法是使用一个对android友好的AsyncTask。您可以阅读指南。

    当您按下ListView上的项目时,您的应用程序应该崩溃,或者什么?@blackbelt抱歉。我忘了上传logcat.n我是怎么更新的。@anuruddhika第161行是什么?@Raghundan HashMap obj=(HashMap)adapter.getItem(arg2);这就是那一行。@anuruddhika NPE是bcoz adapter没有初始化我没有得到它。:(你没有得到什么?你能更具体一点吗?我不明白,“我该怎么解决这个问题?”要修复
    NPE
    请使用
    onItemClick
    的第一个参数@blackbelt Ok。我知道了。但它显示图像URL。我想获取hashMap的Id。它是银行名称。
    @Override
    public Object getItem(int position) {
        return dataset.get(position);
    }
    
       @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Pair<String, String> item = (Pair<String, String>)getItem(position);
            String Value = item.second;
        }
    
       list.setOnItemClickListener(new OnItemClickListener() {
    
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
           Pair<String, String> item = (Pair<String, String>)arg0.getItemAtPosition(arg2);
           String id = item.first;
        }