Android通过id更新自定义XML imageView

时间:2015-08-11 10:35:36

标签: java android xml android-listview simpleadapter

我是Android新手。我正在使用列表视图,该视图使用自定义list_v.xml来容纳x2 textviews。我还添加了一个imageView,我想通过活动更新。

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

<ImageView
    android:id="@+id/icon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />


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

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

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

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

imageView src不会来自我的Json请求,它将是包中的drawable。

@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。我可能完全忽略了这一点。

2 个答案:

答案 0 :(得分: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});

答案 1 :(得分:0)

  

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

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

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

class 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);