2016-04-12 13 views
6

W zeszłym tygodniu próbuję rozwiązać ten problem. zobacz wszystkie podobne pytania i nie wiem dlaczego, rozwiązania nie działają dla mnie. Mam widok listy i każdy element ma widok obrazu. po kliknięciu na widok obrazu chcę zmienić zasób obrazu. dobrze. wszystko gotowe. ale podczas przewijania zasoby obrazu zmieniają się. mój pełny kod jest:Moje obrazy zmieniają się podczas przewijania w widoku listy Android

public class CustomBaseAdapter extends BaseAdapter { 

Context context; 
ArrayList<String> items; 

    public CustomBaseAdapter(Context context,ArrayList<String> items){ 
     this.context = context; 
     this.items = items; 
    } 

private class ViewHolder{ 
    TextView titr; 
    ImageView image; 
} 

@Override 
public int getCount() { 
    return items.size(); 
} 

@Override 
public Object getItem(int position) { 
    return items.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return items.hashCode(); 
} 

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    View vi = view; 
    final ViewHolder holder ; 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    if(view==null){ 

     vi = inflater.inflate(R.layout.customlistitem,null); 
     holder = new ViewHolder(); 
     holder.titr = (TextView) vi.findViewById(R.id.listtext); 
     holder.image = (ImageView) vi.findViewById(R.id.listimg); 
     holder.image.setTag(position); 
     vi.setTag(holder); 
    } 
    else{ 
     holder = (ViewHolder) vi.getTag(); 
    } 


    holder.titr.setText(items.get(position)); 

    holder.image.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      v.setBackgroundResource(R.drawable.fav_ic); 
     } 
    }); 
    return vi; 
} 

}

gdzie mam błąd?

Odpowiedz

1

spróbować,

public class CustomBaseAdapter extends BaseAdapter { 

Context context; 
ArrayList<Items> items; 

    public CustomBaseAdapter(Context context,ArrayList<Items> items){ 
     this.context = context; 
     this.items = items; 
    } 

    private class ViewHolder{ 
    TextView titr; 
    ImageView image; 
    } 

@Override 
public int getCount() { 
    return items.size(); 
} 

@Override 
public Items getItem(int position) { 
    return items.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return items.hashCode(); 
} 

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    View vi = view; 
    final ViewHolder holder ; 

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    if(view==null){ 

     vi = inflater.inflate(R.layout.customlistitem,null); 
     holder = new ViewHolder(); 
     holder.titr = (TextView) vi.findViewById(R.id.listtext); 
     holder.image = (ImageView) vi.findViewById(R.id.listimg); 
     holder.image.setTag(position); 
     vi.setTag(holder); 
    } 
    else{ 
     holder = (ViewHolder) vi.getTag(); 
    } 


    holder.titr.setText(items.get(position).getStrTxt()); 
    holder.image.setImageResource(items.get(position).getDrawableImage()); 
    holder.image.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      items.set(position,new Items(R.drawable.fav_ic)); 
      notifyDataSetChanged(); 
     } 
    }); 
    return vi; 
} 
} 

Dodaj model Class:

public class Items { 


    int drawableImage; 
    String strTxt; 


    public Items(int drawableImage) { 
    this.drawableImage = drawableImage; 
    } 
    public int getDrawableImage() { 
     return drawableImage; 
    } 

    public void setDrawableImage(int drawableImage) { 
     this.drawableImage = drawableImage; 
    } 

    public String getStrTxt() { 
     return strTxt; 
    } 

    public void setStrTxt(String strTxt) { 
     this.strTxt = strTxt; 
    } 
} 
+0

ten kod wygląda świetnie. ale w linii: "items.set (position) .setDrawableImage (R.drawable.fav_ic);" powinien zmienić się na items.get() –

+0

edytowałem kod, proszę sprawdzić –

+0

dziękuję. Twój kod jest poprawny. mój problem został rozwiązany. –

1

Dzieje się tak, ponieważ podczas przewijania listview system android zawsze tworzyć nowy wiersz i niszczyć niewidoczne wiersze. Trzeba zmodyfikować getView() jak poniżej wtedy wszystko będzie dobrze:

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    View vi = view; 
    final ViewHolder holder ; 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

    if(view==null){ 

     vi = inflater.inflate(R.layout.customlistitem,null); 
     holder = new ViewHolder(); 
     holder.titr = (TextView) vi.findViewById(R.id.listtext); 
     holder.image = (ImageView) vi.findViewById(R.id.listimg); 
     holder.image.setTag(position); 
     vi.setTag(holder); 
    } 
    else{ 
     holder = (ViewHolder) vi.getTag(); 
    } 


    holder.titr.setText(items.get(position)); 
if(sp.getBoolean("position="+position, false)){ 
    v.setBackgroundResource(R.drawable.fav_ic); 
} 
    holder.image.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      v.setBackgroundResource(R.drawable.fav_ic); 

SharedPreferences.Editor edit = sp.edit(); 
edit.putBoolean("position="+position, true); 
edit.commit(); 

     } 
    }); 
    return vi; 
} 
6

trzeba użyć jedną wartość logiczną w uchwycie, aby sprawdzić, czy tło obrazu jest ustawiony lub nie do określonego wiersza.

posiadacz

private class ViewHolder{ 
    TextView titr; 
    ImageView image; 
boolean isSet; 
} 

zestaw obraz

holder.image.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      v.setBackgroundResource(R.drawable.fav_ic); 
holder.isSet = true 
     } 
    }); 

if(holder.isSet) 
{ 
holder.image.setBackgroundResource(R.drawable.fav_ic); 
} 
else{ 
holder.image.setBackgroundResource(no image or other image); 
} 

nadzieję, że pomoże.

1

Powinieneś zdefiniować layoutInflater w konstruktorze, ponieważ wywołanie getView() dla każdego wiersza, więc jeśli zdefiniujesz layoutInflater w getView(), to LayoutInflater definiują ponownie dla każdego wiersza.

1

Tak, problem ten pojawia się zawsze w ListView bo android zawsze zniszczyć i odtworzyć wierszy w nim.

Masz dwie możliwości:

Pierwszy, modyfikować swój Adapter zapisać stan dla każdego wiersza w ListView i sprawdzić ten status przed wyświetleniem wiersz.

Po drugie, polecam ten jeden i używam go w moim kodzie, można użyć RecyclerView, ten problem nie stanie się z nim.

Powiązane problemy