Android 通过 id 更新自定义 XML imageView

Posted

技术标签:

【中文标题】Android 通过 id 更新自定义 XML imageView【英文标题】:Android update custom XML imageView by id 【发布时间】:2015-11-03 12:59:22 【问题描述】:

我对 android 很陌生。我正在使用一个列表视图,它使用自定义 list_v.xml 来容纳 x2 文本视图。我还包含了一个我想通过活动更新的 imageView。

<?xml version="1.0" encoding="utf-8"?>

<ImageView
    android:id="@+id/icon"
    android:layout_
    android:layout_ />


<TextView
    android:id="@+id/title"
    android:layout_
    android:layout_
    android:textSize="24sp"
    android:maxHeight="40sp"
    android:textColor="#FFFFFF" />

<TextView
    android:id="@+id/body"
    android:layout_
    android:layout_
    android:textSize="24sp"
    android:maxHeight="35sp"
    android:textColor="#FFFFFF" />

我已经使用这个简单的适配器概念通过 Json 更新了 textview,但我想将每一行的 imageView 设置为相同。我可以将drawable硬编码到上面的xml中,但如果有意义的话,我想重用这个视图并为其他视图更新图像。

这是我更新 textViews 的活动类,但如何以编程方式更新 imageView 以对所有行使用相同的图像。

imageView src 不会来自我的 Json 请求,它将是包中的可绘制对象。

@Override
    protected void onPostExecute(JSONArray json) 
        pDialog.dismiss();


        try 

            // Getting JSON Array from URL
            for(int i = 0; i < json.length(); i++)
                JSONObject c = json.getJSONObject(i);

                // Storing  JSON item in a Variable
                String cat = "Category: " + c.getString(TAG_Cat);
                String title = c.getString(TAG_Title);

                // Adding value HashMap key => value
                HashMap<String, String> map = new HashMap<String, String>();

                map.put(TAG_Cat, cat);
                map.put(TAG_Title, title);

                oslist.add(map);
                listView = (ListView)findViewById(R.id.listView);


                ListAdapter adapter = new SimpleAdapter(TopTipsActivity.this, oslist,
                        R.layout.list_v,
                        new String[]  TAG_Cat,TAG_Title,
                        new int[] R.id.title,R.id.body);

                listView.setAdapter(adapter);
                listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 

                    @Override
                    public void onItemClick(AdapterView<?> parent, View view,
                                            int position, long id) 
                        Toast.makeText(TopTipsActivity.this, "You Clicked at "+oslist.get(+position).get("Title"), Toast.LENGTH_SHORT).show();

                    
                );

            
         catch (JSONException e) 
            e.printStackTrace();
        

    

我试过用

 ImageView image = (ImageView) listView.findViewById(R.id.icon);
 image.setBackgroundResource(R.drawable.tip_selected);

我猜我需要以某种方式引用 list_v 而不是 listView.findViewById。我可能完全没有抓住重点。

【问题讨论】:

是的,您需要访问列表的每一行/元素,然后从中找到 ImageView。所以基本上你应该使用扩展 BaseAdapter 的自定义适配器类。 【参考方案1】:

这很简单,只需将您的HashMap 编辑为

HashMap<String, String> map = new HashMap<String, String>();
map.put(TAG_Cat, cat);
map.put(TAG_Title, title);
// the following line will add the default image to your map
map.put("Image", String.valueOf(R.drawable.ic_launcher));

并将SimpleAdapter 编辑为

ListAdapter adapter = new SimpleAdapter(TopTipsActivity.this, oslist,
                    R.layout.list_v,
                    new String[]  TAG_Cat, TAG_Title, "Image",
                    new int[] R.id.title, R.id.body, R.id.icon);

【讨论】:

天哪,这真的很简单,我真的是 Android 新手!非常感谢。【参考方案2】:

我可以将drawable硬编码到上面的xml中,但我想重用这个视图并为其他视图更新图像

这没有意义。适配器将根据需要创建视图,并且您不会通过这种方法 AFAIK 节省任何内存。

无论如何,如果你想实现你的目标,你需要扩展 BaseAdapter 类并覆盖它的 getView() 方法。

类 CustomArray 扩展 SimpleAdapter

    public CustomArray(Context context,ArrayList list1, int resource,
                       String[] list2, int[] list3) 
        super(context, list1, resource, list2, list3);

    

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

        if (convertView == null)
            convertView = super.getView(position, convertView, parent);
            ((ImageView)convertView.findViewById(R.id.icon)).setImageDrawable(R.drawable.tip_selected);
        
        return convertView;
    

并创建它:

 private void makeActionOverflowMenuShown() 
    CustomArray adapter = new CustomArray(TopTipsActivity.this, oslist,
            R.layout.list_v,
            new String[]  TAG_Cat,TAG_Title,
            new int[] R.id.title,R.id.body);

    listView.setAdapter(adapter);

【讨论】:

以上是关于Android 通过 id 更新自定义 XML imageView的主要内容,如果未能解决你的问题,请参考以下文章

Android 自定义视图 XML 中的复杂属性

从 xml 制作自定义视图

自定义字体和 XML 布局 (Android)

Android 自定义View

android xml引用不到自定义的view类。 类名包名都正确。

在使用xml的android TextView中使用自定义字体