ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android-如何获取ListView onItemClick中的HashMap id值?

2019-11-22 01:28:00  阅读:165  来源: 互联网

标签:android-listview android


我试图将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);

        }
    });
}

这是我的适配器类

public class ItemsAdapter extends BaseAdapter {

    private final Context context;
    ImageView imageView;
    private String[] mKeys;
    HashMap<String, String> map;

    ItemsAdapter(Context context, HashMap<String, String> map) {

        this.context = context;
        this.map = map;
        mKeys = map.keySet().toArray(new String[map.size()]);
}

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return map.size();
    }

    @Override
    public Object getItem(int position) {

        return map.get(mKeys[position]);
    }
    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

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

        String key = mKeys[position];
        String Value = getItem(position).toString();

            LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            View rowView = convertView;
            if (null == convertView)
                rowView = inflater.inflate(R.layout.items, parent, false);
            imageView = (ImageView) rowView.findViewById(R.id.imageView1);
            Bitmap bitmap;
            URL imageURL = null;


            Log.d("value", Value);
            Log.d("key", key);
        try {
            imageURL = new URL(Value);
        }

        catch (MalformedURLException e) {
            e.printStackTrace();
        }

        try {
            HttpURLConnection connection = (HttpURLConnection) imageURL.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream inputStream = connection.getInputStream();

            bitmap = BitmapFactory.decodeStream(inputStream);// Convert to bitmap
            imageView.setImageBitmap(bitmap);
        } catch (IOException e) {

            e.printStackTrace();
        }

            return rowView ;
        }
}

这是LogCat错误.

03-17 13:58:13.620: E/AndroidRuntime(10172): FATAL EXCEPTION: main
03-17 13:58:13.620: E/AndroidRuntime(10172): java.lang.NullPointerException
03-17 13:58:13.620: E/AndroidRuntime(10172):    at com.example.testhashimage.MainActivity$1.onItemClick(MainActivity.java:161)
03-17 13:58:13.620: E/AndroidRuntime(10172):    at android.widget.AdapterView.performItemClick(AdapterView.java:301)
03-17 13:58:13.620: E/AndroidRuntime(10172):    at android.widget.AbsListView.performItemClick(AbsListView.java:1280)
03-17 13:58:13.620: E/AndroidRuntime(10172):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:3071)
03-17 13:58:13.620: E/AndroidRuntime(10172):    at android.widget.AbsListView$1.run(AbsListView.java:3973)
03-17 13:58:13.620: E/AndroidRuntime(10172):    at android.os.Handler.handleCallback(Handler.java:615)
03-17 13:58:13.620: E/AndroidRuntime(10172):    at android.os.Handler.dispatchMessage(Handler.java:92)
03-17 13:58:13.620: E/AndroidRuntime(10172):    at android.os.Looper.loop(Looper.java:137)
03-17 13:58:13.620: E/AndroidRuntime(10172):    at android.app.ActivityThread.main(ActivityThread.java:4960)
03-17 13:58:13.620: E/AndroidRuntime(10172):    at java.lang.reflect.Method.invokeNative(Native Method)
03-17 13:58:13.620: E/AndroidRuntime(10172):    at java.lang.reflect.Method.invoke(Method.java:511)
03-17 13:58:13.620: E/AndroidRuntime(10172):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
03-17 13:58:13.620: E/AndroidRuntime(10172):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
03-17 13:58:13.620: E/AndroidRuntime(10172):    at dalvik.system.NativeStart.main(Native Method)

解决方法:

您有两个错误.首先,您正在尝试访问未初始化的成员类,因为您要对成员类的作用域进行hd重定义具有本地作用域的变量.这很容易修复.您可以使用

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {

onItemClick的firs参数来检索位置的元素.您的情况是:

 arg0.getItemAtPosition(arg2)

第二个错误是您正在将字符串转换为HashMap.您的getItem返回:

map.get(mKeys[position]);

并且由于您声明了HashMap< String,String>在您的自定义适配器中,getItem实际上是返回一个String实例.所以你选错了演员.修复NPE后,您将立即收到ClassCastException

编辑:实现您想要的,您应该从

>将表单HashMap切换到另一种,基于索引的,基于订单的集合.例如,它可以是ArrayList< Pair< String,String>&gt ;,也可以创建自己的javabean.我假设您将使用Pair类,其中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;
    }

在onItemClick内,您将得到类似的内容:

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

正如@Raghunandan正确指出的那样,您应该将所有与网络/阻止相关的操作都放到另一个线程中.对Android友好的最简单的方法是使用AsyncTask.您可以阅读this指南.

标签:android-listview,android
来源: https://codeday.me/bug/20191122/2056002.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有