Android ListView中的ImageView
我对Android ListView中的ImageView,android,listview,imageview,Android,Listview,Imageview,我对ListView中的imageview有一个问题 我制作了一个列表视图,每行有2个文本视图(tvName和tvPrice),我从数据库中获取textview的值,还有一个ImageView(ivAvailability)显示项目是否可用(绿色圆圈-可用,红色圆圈-不可用)使用中的图像存储在res/drawable文件夹中。我还实施了GCM服务,当项目可用性发生变化时,我将使用它更新imageview 示例:我的列表视图中有3个项目(item1,item2,item3)。我们发现item3用完
ListView
中的imageview
有一个问题
我制作了一个列表视图
,每行有2个文本视图
(tvName
和tvPrice
),我从数据库中获取textview
的值,还有一个ImageView
(ivAvailability
)显示项目是否可用(绿色圆圈-可用,红色圆圈-不可用)使用中的图像存储在res/drawable
文件夹中。我还实施了GCM服务,当项目可用性发生变化时,我将使用它更新imageview
示例:我的列表视图中有3个项目(item1
,item2
,item3
)。我们发现item3
用完了,所以我们想将图片从绿色圆圈更新为红色圆圈。在我的GCM消息中,我有一个int值(如果不可用,则为0,如果可用,则为1),我希望ImageView
相应地更改
在我的ListActivity
中,我通过BroadcastReceiver
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String item = intent.getStringExtra("item");
int id = intent.getIntExtra("id", 0); // 0 => id's default value
int available = intent.getIntExtra("available", 0); // 0 => availability's default value
Log.d(TAG, "Item: " + item);
Log.d(TAG, "ID: " + id);
Log.d(TAG, "Availability: " + availability);
updateView(id, availability);
adapter.notifyDataSetChanged();
}
};
这是我的updateView
方法
private void updateView(int id, int availability){
View v = lvItem.getChildAt(id);
if(v == null) return;
switch (availability){
case 0:
//here i want to call the imageView in the respected row (example in row 3) and
//change it with something like `setImageResource(R.drawable.traffic_red);`
break;
case 1:
//here i want to call the imageView in the respected row (example in row 3) and
//change it with something like `setImageResource(R.drawable.traffic_green);`
break;
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Inflate a new view or use a recycled view.
View v = convertView;
GenericViewHolder holder;
if (null == v) {
LayoutInflater vi =
(LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(mLayoutResource, null);
holder = new GenericViewHolder();
holder.root = v;
// init the sub views and put them in a holder instance
CustomAdapterUtils.initViews(v, holder, mBindDictionary);
v.setTag(holder);
} else {
holder = (GenericViewHolder) v.getTag();
}
// Show the data
final T item = getItem(position);
showData(item, holder, position);
return v;
}
MyGenericViewHolder.java
public class GenericViewHolder {
public View root;
public TextView[] stringFields;
public ImageView[] staticImageFields;
public View[] baseFields;
}
我的getView()
方法
private void updateView(int id, int availability){
View v = lvItem.getChildAt(id);
if(v == null) return;
switch (availability){
case 0:
//here i want to call the imageView in the respected row (example in row 3) and
//change it with something like `setImageResource(R.drawable.traffic_red);`
break;
case 1:
//here i want to call the imageView in the respected row (example in row 3) and
//change it with something like `setImageResource(R.drawable.traffic_green);`
break;
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Inflate a new view or use a recycled view.
View v = convertView;
GenericViewHolder holder;
if (null == v) {
LayoutInflater vi =
(LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(mLayoutResource, null);
holder = new GenericViewHolder();
holder.root = v;
// init the sub views and put them in a holder instance
CustomAdapterUtils.initViews(v, holder, mBindDictionary);
v.setTag(holder);
} else {
holder = (GenericViewHolder) v.getTag();
}
// Show the data
final T item = getItem(position);
showData(item, holder, position);
return v;
}
和项目的xml文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:id="@+id/tvName"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:text="Large Text" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Large Text"
android:id="@+id/tvPrice"
android:layout_below="@+id/tvName"
android:layout_alignParentStart="true" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ivTrafficLight"
android:contentDescription=""
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:src="@mipmap/ic_launcher" />
我正在使用(FunDapter)lib
因此,我的问题是如何找到第三行的ImageView
?我尝试了findViewById(R.id.ivAvailability)
,但这总是会改变最上面一行的ImageView
,而不是我想要的。那么如何将它们彼此区分开来呢?查看v=lvItem.getChildAt(id);这将返回特定的行项目
您可以获得行项目的imageview,如下所示
v.findViewById(R.id.ivAvailability);
视图v=lvItem.getChildAt(id);这将返回特定的行项目
您可以获得行项目的imageview,如下所示
v.findViewById(R.id.ivAvailability);
好的,我没有看到适配器的代码,但无论如何,在适配器中使用ViewHolder内部类是个好主意。
public static class ViewHolder {
public ImageView imageView;
}
然后,在getView方法中,可以执行以下操作:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder _viewHolder;
if(convertView == null) {
convertView = _layLayoutInflater.inflate(_resourceID, parent, false);
_viewHolder = new ViewHolder();
_viewHolder.imageView = (ImageView) convertView.findViewById(R.id.item_image);
convertView.setTag(_viewHolder);
}
else
_viewHolder = (ViewHolder) convertView.getTag();
return convertView;
}
毕竟,当您执行View v=lvItem.getChildAt(id)时代码>制作以下内容:
Adapter.ViewHolder viewHolder = (Adapter.ViewHolder) v.getTag();
viewHolder.imageView.setImageResource(...)
试试看,希望有帮助
更新。好的,这两个都对我有用。
1.
二,
TextView t = (TextView) v.findViewById(R.id.your_item);
t.setText("abracadabra");
请先尝试使用文本框,然后使用图像容器。谢谢。
PS.这两个函数都没有调用notifyDataSetChanged()
好的,我没有看到适配器的代码,但无论如何,在适配器中使用ViewHolder内部类是个好主意。
public static class ViewHolder {
public ImageView imageView;
}
然后,在getView方法中,可以执行以下操作:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder _viewHolder;
if(convertView == null) {
convertView = _layLayoutInflater.inflate(_resourceID, parent, false);
_viewHolder = new ViewHolder();
_viewHolder.imageView = (ImageView) convertView.findViewById(R.id.item_image);
convertView.setTag(_viewHolder);
}
else
_viewHolder = (ViewHolder) convertView.getTag();
return convertView;
}
毕竟,当您执行View v=lvItem.getChildAt(id)时代码>制作以下内容:
Adapter.ViewHolder viewHolder = (Adapter.ViewHolder) v.getTag();
viewHolder.imageView.setImageResource(...)
试试看,希望有帮助
更新。好的,这两个都对我有用。
1.
二,
TextView t = (TextView) v.findViewById(R.id.your_item);
t.setText("abracadabra");
请先尝试使用文本框,然后使用图像容器。谢谢。
PS.这两种方法都没有调用notifyDataSetChanged()
您尝试了v.findViewById(R.id.ivAvailability)
?您必须将id属性与您将从gcm接收的列表元素相关联,并且您还必须将该id视为列表视图中的位置。获取该位置的项目并更新iTunes v.findViewById(R.id.ivAvailability)以获取第三行图像视图您尝试了v.findViewById(R.id.ivAvailability)
?您必须将id属性与您将从gcm接收到的列表元素相关联,并且必须将该id视为列表视图中的位置。获取该位置的项目,并更新ituse v.findViewById(R.id.ivAvailability)以获取第三行图像视图i thinkAdapter.ViewHolder ViewHolder=(Adapter.ViewHolder)v代码>应该是Adapter.ViewHolder ViewHolder=(Adapter.ViewHolder)v.getTag()代码>当然,你说得对,谢谢!不知怎的在复制时丢失了它。再次感谢。非常感谢你抽出时间,但那对我不起作用。我将添加GenericViewHolder
类和我的getView
方法。好的,我找到了它,它工作了(只需要做一些小的修改):D非常感谢你的帮助,我会接受你的回答我想Adapter.ViewHolder ViewHolder=(Adapter.ViewHolder)v代码>应该是Adapter.ViewHolder ViewHolder=(Adapter.ViewHolder)v.getTag()代码>当然,你说得对,谢谢!不知怎的在复制时丢失了它。再次感谢。非常感谢你抽出时间,但那对我不起作用。我将添加GenericViewHolder
类和我的getView
方法。好的,我找到了它,它工作了(只需要做一些小的修改):D非常感谢你的帮助,我会接受你的回答