Android 通过 id 更新自定义 XML imageView
Android update custom XML imageView by id
我对 Android 很陌生。我正在使用一个列表视图,它使用自定义 list_v.xml 来容纳 x2 文本视图。我还包括一个 imageView,我想通过 activity.
更新它
<?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 更新了文本视图,但我想将每行的 imageView 设置为相同。我可以将可绘制对象硬编码到上面的 xml,但如果有意义的话,我想重用此视图并为其他视图更新图像。
这是我的 activity class 更新 textView 的地方,但我如何以编程方式更新 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。我可能完全忽略了这一点。
I could hardcode the drawable to the xml above but I would like to reuse this view and update the image for other views
没有意义。适配器将根据需要创建视图,并且您不会通过这种方法 AFAIK 节省任何内存。
无论如何,如果你想实现你的目标,你需要扩展 BaseAdapter class 并覆盖它的 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);
就这么简单,只需将您的 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 很陌生。我正在使用一个列表视图,它使用自定义 list_v.xml 来容纳 x2 文本视图。我还包括一个 imageView,我想通过 activity.
更新它<?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 更新了文本视图,但我想将每行的 imageView 设置为相同。我可以将可绘制对象硬编码到上面的 xml,但如果有意义的话,我想重用此视图并为其他视图更新图像。
这是我的 activity class 更新 textView 的地方,但我如何以编程方式更新 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。我可能完全忽略了这一点。
I could hardcode the drawable to the xml above but I would like to reuse this view and update the image for other views
没有意义。适配器将根据需要创建视图,并且您不会通过这种方法 AFAIK 节省任何内存。
无论如何,如果你想实现你的目标,你需要扩展 BaseAdapter class 并覆盖它的 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);
就这么简单,只需将您的 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});