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;
}
My
GenericViewHolder.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 think
Adapter.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非常感谢你的帮助,我会接受你的回答