Search code examples
androidbaseadapter

onclick image change on BaseAdapter


I want to change imageview source (and music of course) from onclicklistener. It is changed, but first image changes on every click. How can i fix it?

This is my code:

public View getView(final int p, View v, ViewGroup arg2)
            {
                    Log.w("BaseAdapter", "p: "+p+", preP: "+preP );
                    
                    if (v == null)
                        v = li.inflate(R.layout.listview_item, null);
                                            
                    ImageView iv = (ImageView) v.findViewById(R.id.imageView1);
                    TextView baslik = (TextView) v.findViewById(R.id.textView1);
                    baslik.setText( isimler[p] );
                    
                    if ( p == preP )
                        iv.setImageResource(R.drawable.stop);
                    
                    v.setOnClickListener(new View.OnClickListener()
                    {
                        public void onClick(View v)
                        {
                            if( preP != p  )
                            {
                                System.out.println("müzik çalışılacak.");
                                mPlay = MediaPlayer.create( getApplicationContext(), sarkilar[p] );
                                mPlay.start();
                                preP=p;
                            }
                            else
                            {
                                mPlay.stop();
                                preP=-1;
                            }

                            //getView(p, v, arg2);
                            initList();                             
                        }
                    });

                    return v;
                }
                

Solution

  • You have to use a onItemClickListener on your ListView because this is the correct way to do it.

        listView.setOnItemClickListener(new OnItemClickListener() {
    
            public void onItemClick(AdapterView<?> adapterView, View v, int pos,
                                    long arg3) {
                Item i = (Item) adapterView.getItemAtPosition(pos);
                ImageView iv = (ImageView) v.findViewById(R.id.imageView1);
                iv.setImageResource(R.drawable.your_image);
    
                mPlay = MediaPlayer.create( getApplicationContext(), sarkilar[pos] );
                                mPlay.start();
            }
        });
    

    OR

    If I had to modify your code

        v.setTag(p); //attach the position to your view
        v.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                //How you get the correct ImageView
                ImageView iv = (ImageView) v.findViewById(R.id.imageView1);
                iv.setImageResource(R.drawable.your_image);
    
                //The position is attached to the Clicked view
                int position = (int) v.getTag(); 
    
                if( preP != position  )
                {
                    System.out.println("müzik çalışılacak.");
                    mPlay = MediaPlayer.create( getApplicationContext(), sarkilar[position] );
                    mPlay.start();
                    preP=position;
                }
                else
                {
                    mPlay.stop();
                    preP=-1;
                }
    
                //getView(p, v, arg2);
                initList();                             
            }
        });
    

    But personally I would not use the second approach