2017-10-18 8 views
-1

私はリスト項目(duh)を示すListViewを持っています。リスト項目のclickを入力すると、別のActivityが開きます。リスト項目layoutの一部はグレーの星で、ImageViewです。このImageViewをクリックすると別のActivityを開きたくないですが、星の色を緑色(=お気に入りにマークする)または戻る(=お気に入りではないとマークする)に変更します。私はOnClickListenerでそれを行い、別のImageViewClickにロードし、adapterをリフレッシュしました。しかし、ImageViewを変更するには、それをクリックした後にActivityのままにして、再度入力する必要があります。即座に更新されません。なぜ、私はそれをどのように変更できますか?私はいろいろなバージョンを試しましたが、これまでのところ何もできません。私のListViewAdapterBaseAdapterになります。ありがとうございました!リスト項目の一部である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()) 

ウントのhierダスの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 

と私はあなたが実際にListデータには変更を加えることはありませんとあなたがnotifyDataSetChanged();を必要とされます事をしないでください!

+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メソッドが誤って評価されている可能性があります)。そして、現在のお気に入り状態に関係なく – Mars

+0

未使用状態のonClickListenerの設定を解除していないため、両方がトリガーされていると、別のセルのonClickListenerもトリガーされている可能性があります。 – Mars

関連する問題