如何更改ImageView,它是列表项的一部分?

时间:2017-10-18 06:35:14

标签: android listview baseadapter listitem notifydatasetchanged

我有ListView显示列表项(duh)。当您在列表项上click时,会打开另一个Activity。列表项layout的一部分是灰色星,ImageView。当您点击此ImageView时,我不想打开另一个Activity,但我想将星的颜色更改为绿色(=将项目标记为收藏)或返回( =标记为不喜欢)。我设法使用OnClickListener执行此操作,在ImageView上加载另一个Click,然后刷新adapter。但是要更改ImageView,点击后我需要离开Activity然后再次输入。它不会立即刷新。为什么,我该如何改变呢?我尝试了很多不同的版本,到目前为止没有任何作用。我的ListViewAdapter扩展了BaseAdapter。谢谢!

public class ListViewAdapterKeysAToZ extends BaseAdapter {

private ArrayList<KeyTagIntern> keyTags;
private ObservableArrayList<KeyTagIntern> list;
private Context context;
TextView name;
TextView place;
ImageView star, favoriteStar;    

public ListViewAdapterKeysAToZ(Context context, ObservableArrayList<KeyTagIntern> list) 

{
    this.context = context;
    this.list = list;

    keyTags = new ArrayList<>();

    for (KeyTagIntern keytag : list) {
        keyTags.add(keytag);
    }
    //(....)
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

KeyTagIntern key = (KeyTagIntern) getItem(position);

  if (convertView == null) {
                convertView = LayoutInflater.from(context).inflate(R.layout.list_item_keys, parent, false);
            }

            name = (TextView) convertView.findViewById(R.id.text_keylist_item);
            name.setText(key.getName());

            place = (TextView) convertView.findViewById(R.id.text_keylist_item_place);
            place.setText(key.getPlace());

            star = (ImageView) convertView.findViewById(R.id.right_icon_keylist_item);
            favoriteStar = (ImageView) convertView.findViewById(R.id.right_icon_keylist_item_favorite);

if (key.isFavorite())
{ 
    star.setVisibility(View.INVISIBLE);
    favoriteStar.setVisibility(View.VISIBLE)

    favoriteStar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            // This makes key.isFavourite() = false for the next time
            Paper.book().delete(FAVORIT + String.valueOf(key.getKeyTagID()));

            //Since notifyDataSetChanged() didn't work for me, I tried this - but no change
            int index = list.indexOf(key);
            list.remove(index);
            list.add(index, key);

            keyTags = new ArrayList<>();

            for (KeyTagIntern keytag : list) {
                keyTags.add(keytag);
            }
            notifyDataSetChanged();
        }
    });
}

// Then do the opposite for if (!key.isFavourite())

Und hier das xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/list_item_keys"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@color/MiddleDarkGrey">


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/btn_list_item_keys"
    android:layout_width="match_parent"
    android:layout_height="@dimen/height_list_item"
    android:layout_marginBottom="3dp"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:layout_marginTop="3dp"
    android:background="@drawable/white_list_item"
    android:paddingLeft="13dp"
    android:paddingRight="10dp">

    <ImageView
        android:id="@+id/icon_keylist_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_centerVertical="true"
        android:visibility="visible"
        app:srcCompat="@drawable/ic_key" />

    <ImageView
        android:id="@+id/icon_reserved"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/chb_add_key"
        android:layout_centerVertical="true"
        android:visibility="invisible"
        app:srcCompat="@drawable/ic_reservate_orange" />

    <ImageView
        android:id="@+id/icon_taken"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/chb_add_key"
        android:layout_centerVertical="true"
        android:visibility="invisible"
        app:srcCompat="@drawable/ic_taken_red" />

    <TextView
        android:id="@+id/text_keylist_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginStart="10dp"
        android:layout_toEndOf="@+id/icon_keylist_item"
        android:layout_toRightOf="@+id/icon_keylist_item"
        android:gravity="center_vertical"
        android:layout_centerVertical="true"
        android:text="Text"
        android:textColor="@color/DarkGrey"
        android:textSize="@dimen/text_list_item" />

    <TextView
        android:id="@+id/text_keylist_item_place"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/text_keylist_item"
        android:layout_alignLeft="@+id/text_keylist_item"
        android:layout_marginLeft="2dp"
        android:layout_marginBottom="5dp"
        android:text="Where is the key?"
        android:textColor="@color/DarkGrey"
        android:textSize="@dimen/text_list_item_sub" />

    <ImageView
        android:id="@+id/right_icon_keylist_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        app:srcCompat="@drawable/ic_fav_green" />

    <ImageView
        android:id="@+id/right_icon_keylist_item_favorite"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/ic_fav_chosen"
        android:visibility="invisible"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

</RelativeLayout>

2 个答案:

答案 0 :(得分:0)

我认为你的方法应该是这样的。
而隐藏和显示图像只是改变它的

if (key.isFavorite())
{ 
favoriteStar.setImageResource(R.drawable.aaa);

favoriteStar.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) 
    favoriteStar.setImageResource(R.drawable.bbb);
    // and vice-versa

并且我不需要notifyDataSetChanged();,因为您实际上并未对List数据进行任何更改!

答案 1 :(得分:0)

最后答案是相当愚蠢的,因为它经常发生,而且你们不能帮助我,因为我在我的适配器类的开头排除了代码(现在添加它)。它实际上一直工作,但我没有看到它,因为列表最后的列表项被更改,而不是选中的列表项。这是因为我在适配器类的开头声明了变量,而不是在getView方法中。

我把它改成了这个,现在它完美无缺:

public class ListViewAdapterKeysAToZ extends BaseAdapter {

private ArrayList<KeyTagIntern> keyTags;
private ObservableArrayList<KeyTagIntern> list;
private Context context;


public ListViewAdapterKeysAToZ(Context context, ObservableArrayList<KeyTagIntern> list) {
    this.context = context;
    this.list = list;

    keyTags = new ArrayList<>();

    for (KeyTagIntern keytag : list) {
        keyTags.add(keytag);
    }
// (...)


 @Override
public View getView(final int position, View convertView, ViewGroup parent) {

    KeyTagIntern key = (KeyTagIntern) getItem(position);

    TextView name;
    TextView place;
    ImageView star, favoriteStar;

            if (convertView == null) {
                convertView = LayoutInflater.from(context).inflate(R.layout.list_item_keys, parent, false);
            }

            name = (TextView) convertView.findViewById(R.id.text_keylist_item);
            name.setText(key.getName());

            place = (TextView) convertView.findViewById(R.id.text_keylist_item_place);
            place.setText(key.getPlace());

            star = (ImageView) convertView.findViewById(R.id.right_icon_keylist_item);
            favoriteStar = (ImageView) convertView.findViewById(R.id.right_icon_keylist_item_favorite);

            if (key.isFavorite()) {
                star.setVisibility(View.INVISIBLE);
                favoriteStar.setVisibility(View.VISIBLE);
            }else {
                star.setVisibility(View.VISIBLE);
                favoriteStar.setVisibility(View.INVISIBLE);
            }

            star.setOnClickListener(v -> {
                key.setFavorite(true);
                Paper.book().write(FAVORIT + String.valueOf(key.getKeyTagID()), true);
                notifyDataSetChanged();
            });

            favoriteStar.setOnClickListener(v -> {
                key.setFavorite(false);
                Paper.book().delete(FAVORIT + String.valueOf(key.getKeyTagID()));
                notifyDataSetChanged();
            });