2016-03-19 13 views
0

Bir Görünüm 'ı tıklatarak bir ListView den değiştirmeye çalışıyorum. Benim yöntemim denemek nasıl şuna benzer: Bir tane değiştir ListView öğesi Hata

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); 
} 

bu böyle benim ListView benim onItemClickListener yılında denir:

Şimdi
updateEQAnimation(position); 

benim Sorun:

Ben kaydırma Bir şekilde yukarı veya aşağı diğer ListView öğelerinin ImageView de değişir.Ama aslında sadece bir değiştirmek istiyorum.

cevap

0

En iyi yaklaşım, liste bağdaştırıcınıza genel bir yöntem nasıl eklenir? açıklayacağım.

  1. Önce liste görünümünde göstermek istediğiniz kendi nesneyi oluşturun.

    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. bir adaptör aşağıda gibi olun:

    public class YourAdapter

  3. Şimdi bunu değiştirebilirsiniz aktivitesinde her aşağıda gibi nerede 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(); 
    } 
    

    } uzanır:

    YourAdapter uyarlaması er = new YourAdapter (ctx, items); listView.setAdapter (bağdaştırıcı); YourObject your object = new YourObject (id, R.drawable.other_icon, "name"); adapter.refresh (yourObject);

+0

Bu hata efekti ne kadar temizlenir? –

+0

Android listview nesnesinde, bağdaştırıcınızın yalnızca bazı öğeleri bellekte saklanır (ekran boyutunuz ve liste görünümünde gösterilebilecek öğe sayısı ve biraz daha fazlası). Bu yüzden, nesneleri durum listenizi listenizde kaydetmeniz ve istediğiniz zaman değiştirmeniz gerektiğini bilmelisiniz –