2016-03-19 15 views
0

ImageViewをクリックしたときにListViewからImageViewを変更しようとしています。 私の方法は、私がしようとどのようにそれは次のようになります。ListView要素を1つ変更してみてください。

private void updateEQAnimation(int index){ 
    View v = LV_songView.getChildAt(index -LV_songView.getFirstVisiblePosition()); 

    if(v == null) 
     return; 

    ImageView EQ_ANIM = (ImageView) v.findViewById(R.id.imageView_eq_animation); 
    EQ_ANIM.setVisibility(View.VISIBLE); 
} 

これは、このように私のListViewの私onItemClickListenerに呼び出されます。

updateEQAnimation(position); 

私の問題:

私はスクロール何らかの理由で他のListView要素のImageViewも変更されます。実際には、の1つしか変更しません。

答えて

0

ベスト・アプローチは、リスト・アダプターにパブリック・メソッドを追加する方法ですか?私は説明します。

  1. まず、リストビューで表示する独自のオブジェクトを作成します。

    public class YourObject { 
    
    private int id; 
    private int avatar; 
    private String name; 
    
    public YourObject(int id, int avatar, String name) { 
        this.id = id; 
        this.avatar = avatar; 
        this.name = name; 
    } 
    
    public int getAvatar() { 
        return avatar; 
    } 
    
    public void setAvatar(int avatar) { 
        this.avatar = avatar; 
    } 
    
    public String getName() { 
        return name; 
    } 
    
    public void setName(String name) { 
        this.name = name; 
    } 
    
    public int getId() { 
        return id; 
    } 
    
    public void setId(int id) { 
        this.id = id; 
    } 
    
    @Override 
    public String toString() { 
        return new Gson().toJson(this); 
    }} 
    
  2. アダプタ以下のように行います。

    パブリッククラスYourAdapterが

  3. は今、あなたはそれを変更することができ、あなたの活動のすべてのは、以下のようにどこBaseAdapter {

    private AppCompatActivity ctx; 
    private LayoutInflater li; 
    private LinkedHashMap<Integer, YourObject> items; 
    
    public YourAdapter(AppCompatActivity ctx, LinkedHashMap<Integer, YourObject> items) { 
        this.ctx = ctx; 
        this.items = items; 
        this.li = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 
    
    @Override 
    public int getCount() { 
        return items.size(); 
    } 
    
    @Override 
    public YourObject getItem(int position) { 
        List<YourObject> lst = new ArrayList<>(items.values()); 
        return lst.get(position); 
    } 
    
    @Override 
    public long getItemId(int position) { 
        return 0; 
    } 
    
    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
        convertView = li.inflate(R.layout.lst_item_your_view, null); 
        ImageView avatar = (ImageView) convertView.findViewById(R.id.avatar); 
        CustomTextView name = (CustomTextView) convertView.findViewById(R.id.name); 
    
        name.setText(getItem(position).getName()); 
    
        avatar.setImageResource(getItem(position).getAvatar()); 
    
        return convertView; 
    } 
    
    public void refresh(final YourObject yourObject) { 
          items.remove(yourObject.getId()); 
          items.put(yourObject.getId(), yourObject); 
          notifyDataSetChanged(); 
    } 
    

    }を拡張します。

    YourAdapter adaptあなた=新しいYourAdapter(ctx、items); listView.setAdapter(adapter); YourObjectオブジェクト=新しいYourObject(ID、R.drawable.other_icon、 "name"); adapter.refresh(yourObject);

+0

本当にこのバグの影響がクリアされるのはなぜですか? –

+0

アンドロイド・リストビュー・オブジェクトには、アダプタの一部の要素がメモリに格納されています(画面サイズと要素数がlistviewに表示されます)。オブジェクトの状態をリストに保存し、必要に応じて変更する必要があることを知っておく必要があります –

関連する問題