Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Android] viewholder pattern update meerdere instanties

Pagina: 1
Acties:

  • Workerbee
  • Registratie: Juni 2009
  • Laatst online: 27-10 19:03
In mijn android app gebruik ik voor mijn ListView het ViewHolder pattern. Nu laat ik plaatjes zien aan gebruikers die ze dan kunnen "liken". Zodra het plaatje geliked is, updatet het icoontje van de ImageView likeIcon.

Nu is het zo wanneer ik op like druk bij één van de items in de listview hij ook automatisch de icoontjes van andere plaatjes op "liked" zet. Dit wil ik natuurlijk niet, mijn vraag hoe dit op te lossen en hoe kan dit überhaupt?

ViewHolder.java

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public class MyAdapter extends ArrayAdapter<MyModel> {

Context context;
int layoutResourceId;
List<MyModel> data = null;

public MyAdapter(Context context, int layoutResourceId,
        List<MyModel> data) {
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    final BlockHolder holder;

    if (row == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);
        holder = new BlockHolder();

        holder.imgIcon = (ImageView) row.findViewById(R.id.imgIcon);
        holder.totalVotes = (TextView) row.findViewById(R.id.totalVotes);
        holder.likeIcon = (ImageView) row.findViewById(R.id.likeIcon);
        holder.dislikeIcon = (ImageView) row.findViewById(R.id.dislikeIcon);
        holder.saveIcon = (ImageView) row.findViewById(R.id.saveIcon);

        row.setTag(holder);
    } else {
        holder = (BlockHolder) row.getTag();
    }

    MyModel myBlock = data.get(position);

    ImageLoader.getInstance().displayImage(myBlock.getImage(),
            holder.imgIcon);

    final int totalLikes = myBlock.getLikes() - myBlock.getDislikes();

    holder.totalVotes.setText(totalLikes + " likes");
    final ImageView like = holder.likeIcon;

    holder.likeIcon.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            // ALSO UPDATES OTHER VIEWS...
            holder.likeIcon.setBackgroundResource(R.drawable.thumbs_up_mouse);
        }

    });

    return row;
}

private static class BlockHolder{
    ImageView imgIcon;
    TextView totalVotes;
    ImageView dislikeIcon;
    ImageView likeIcon;
    ImageView saveIcon;
}


Heb de onclick ook al veranderd van:
Java:
1
holder.likeIcon.setBackgroundResource(R.drawable.thumbs_up_mouse); 

naar:
Java:
1
 ((ImageView)v).setBackgroundResource(R.drawable.thumbs_up_mouse);  


Blijft hetzelfde resultaat behouden.

[ Voor 4% gewijzigd door Workerbee op 24-07-2013 20:01 ]


  • Zyppora
  • Registratie: December 2005
  • Laatst online: 16-11 23:56

Zyppora

155/50 Warlock

Je verandert de like button naar een ander plaatje, waardoor alle plaatsen waar je je like button had staan, dat andere plaatje gaan tonen.

Je zult per 'button' een aparte image moeten tonen, die in eerste instantie de like button tonen, en bij klikken individueel veranderen naar de thumbsup image.

Phenom II X4 945 \\ 8GB DDR3 \\ Crosshair IV Formula \\ R9 290


  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

code:
1
holder.likeIcon = (ImageView) row.findViewById(R.id.likeIcon);


Je geeft elke holder een referentie naar dezelfde ImageView. Je moet voor elke holder een nieuw object maken, wil je ze individueel kunnen aanpassen.

  • Workerbee
  • Registratie: Juni 2009
  • Laatst online: 27-10 19:03
Best logisch inderaad. Dit betekent wel dat ik de layout moet maken via de code wil ik elk ImageView uniek maken lijkt me?

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Je kunt de layout vooraf maken, en inflaten bij het maken van een nieuw object. Zie http://developer.android..../view/LayoutInflater.html

  • Workerbee
  • Registratie: Juni 2009
  • Laatst online: 27-10 19:03
Maar dat doe ik hier toch ook?
Java:
1
2
3
4
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
            
holder = new BlockHolder();

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Sorry, verkeerd begrepen. De ImageView moet je inderdaad met programmatisch maken.

  • Workerbee
  • Registratie: Juni 2009
  • Laatst online: 27-10 19:03
Maakt niet uit. Ben sowieso een stuk verder :)

Voeg nu de buttons toe via de code maar blijf hetzelfde effect houden :?

ViewHolder.java
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 
@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        final BlockHolder holder;
        
        if (row == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId,  parent, false);
            holder = new lBlockHolder();
            // nieuws buttons aanmaken dmv nieuwe ImageViews
            this.setButtons(row);
            
            holder.imgIcon = (ImageView) row.findViewById(R.id.imgIcon);
            holder.totalVotes = (TextView) row.findViewById(R.id.totalVotes);
            row.setTag(holder);
        } else {
            holder = (BlockHolder) row.getTag();
        }
        MyModel myBlock = data.get(position);
        ImageLoader.getInstance().displayImage(myBlock.getmage(),holder.imgIcon);

        return row;
    }

private void setButtons(View row){
        RelativeLayout buttons = (RelativeLayout)row.findViewById(R.id.buttons);
        
        ImageView likeIcon = new ImageView(context);
        
        defaultButtonsSettings(likeIcon,1);
        
        buttons.addView(likeIcon);

        likeIcon.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                // test listener..
                Toast.makeText(context, "klik op id-> " + v.getId()  , Toast.LENGTH_SHORT).show();
                v.setBackgroundResource(R.drawable.thumbs_up_mouse);
            }
            
        });
    }


De defaultButtonsSettings functie voegt layoutparams toe aan de view en een background resource.
Als id krijg ik de hele tijd -1 terug.

[ Voor 97% gewijzigd door Workerbee op 25-07-2013 15:48 ]

Pagina: 1