我对ImageViews
中的ListView
提出了疑问。
我创建了一个ListView
,并且在每行中我有TextViews
(tvName
和tvPrice
),我从我的数据库中获取TextViews
的值,以及显示项目是否可用的ImageView
(ivAvailability
)(绿色圆圈 - 可用,红色圆圈 - 不可用)和正在使用的图片存储在res/drawable
文件夹中。我还实现了GCM服务,当项目的可用性发生变化时,我用它来更新ImageViews
。
示例:我的ListView
(item1
,item2
,item3
)中有3个项目。我们发现我们用尽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;
}
}
我的GenericViewHolder.java
public class GenericViewHolder {
public View root;
public TextView[] stringFields;
public ImageView[] staticImageFields;
public View[] baseFields;
}
我的getView()
方法
@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" />
我正在使用this(FunDapter)lib。
所以我的问题是如何在第3行找到ImageView
?我尝试findViewById(R.id.ivAvailability)
,但这总是会更改顶行中的ImageView
而不是我想要的那个。那么我如何将它们与另一个区分开呢?
答案 0 :(得分:2)
好的,我没有看到适配器的代码,但无论如何,在适配器中使用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.
YourAdapter.GenericViewHolder vh = (YourAdapter.GenericViewHolder) v.getTag();
vh.someTextField.setText("bbbbb");
2。
TextView t = (TextView) v.findViewById(R.id.your_item);
t.setText("abracadabra");
请首先使用文本框,然后使用图像容器。谢谢。
PS。两者都没有调用notifyDataSetChanged()
。
答案 1 :(得分:0)
查看v = lvItem.getChildAt(id);这将返回特定的行项目。
您可以在行项目上获取imageview,如下所示
v.findViewById(R.id.ivAvailability);