ListViews中的ImageViews

时间:2016-04-15 09:29:22

标签: android listview imageview

我对ImageViews中的ListView提出了疑问。

我创建了一个ListView,并且在每行中我有TextViewstvNametvPrice),我从我的数据库中获取TextViews的值,以及显示项目是否可用的ImageViewivAvailability)(绿色圆圈 - 可用,红色圆圈 - 不可用)和正在使用的图片存储在res/drawable文件夹中。我还实现了GCM服务,当项目的可用性发生变化时,我用它来更新ImageViews

示例:我的ListViewitem1item2item3)中有3个项目。我们发现我们用尽item3,所以我们想要将图片从绿色圆圈更新为红色圆圈。在我的GCM消息中,我有一个int值(如果不可用则为0,如果可用则为1),我希望ImageView相应地更改。

在我的ListActivity我收到带有BroadcastReceiver

的GCM消息
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而不是我想要的那个。那么我如何将它们与另一个区分开呢?

2 个答案:

答案 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);