2017-10-18 51 views
-1

我有一個ListView顯示列表項目(杜)。當您在列表項目上輸入click時,將打開另一個Activity。部分清單項目layout是灰星,ImageView。當你點擊這個ImageView時,我不想打開另一個Activity,但我想要將星星的顏色更改爲綠色(=將項目標記爲收藏夾)或返回(=標記爲不喜歡)。我設法用OnClickListener做到這一點,在Click上加載另一個ImageView,並刷新adapter。但是對於ImageView更改,點擊後我需要離開Activity並再次輸入。它不會立即刷新。爲什麼,我該如何改變?我已經嘗試了很多不同的版本,到目前爲止沒有任何工作。我的ListViewAdapter延伸到BaseAdapter。謝謝!如何更改ImageView,它是列表項的一部分?

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票數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> 

+1

你能後,你實際設置視圖中的代碼? – Mars

+0

它看起來並不像你實際上在getView函數中設置你的視圖。我們看不到什麼明星或最喜歡的明星引用 – Mars

+0

哦,對不起 - 我離開了它,因爲我不認爲在那部分代碼中可能有任何問題。現在我添加了該部分。 – Mira

回答

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數據沒有變化!

+0

如果我更改來源或設置可視性,我認爲這不重要。而且你應該使用notifyDataSetChanged() - 我認爲這是更簡潔的代碼方式。 – Mira

+0

清晰的編碼方式我真的不這麼認爲,你有一個想法,爲什麼它被使用? – phpdroid

+0

數據已更改 - 通知負責的適配器,而不僅僅是更改表面對我來說更清潔。在發佈這個問題之前,我已經廣泛地檢查了Stackoverflow關於此主題的內容,並且每個upvoted答案都包括以某種方式調用notifyDataSetChanged() – Mira

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(); 
      }); 
+0

這是否仍然有效?如果明星和最喜歡的明星位於同一個地方,看起來上層應該會收到點擊(或兩者)。此外,你聲明的變量應該沒有關係... – Mars

+0

我看到的實質性變化是你的新setFavorite方法(這可能意味着你的isFavorite方法之前未正確評估),並且你爲onClickListeners設置了這個事實,不管當前最喜歡的狀態是什麼 – Mars

+0

因爲您沒有爲未使用狀態取消設置onClickListener,所以如果兩者都觸發,您可能也會在另一個單元上觸發onClickListener。 – Mars

相關問題