Skip to content Skip to sidebar Skip to footer

Android - Identify Items In A Listview

I'm having some troubles with correct identification of items in a ListView. There are 4 classes that matter, it's a lot of code so at first I'm going to explain the logic of thos

Solution 1:

Edit:

Try this

Take a custom Selector in your drawable button_play.xml

<?xml version="1.0" encoding="utf-8"?><selectorxmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:drawable="@drawable/pause_button"android:state_selected="true" /><itemandroid:drawable="@drawable/play_button" /></selector>

Modifty your adapter like this

publicclassAudioListAdapterextendsArrayAdapter<PlaylistItem> {
private PlaylistItem pl;
private Context context;
privateint layoutResourceId;
private PlaylistItem aud;
private ArrayList<PlaylistItem> data = null;
Button previous;

publicAudioListAdapter(Context context, int layoutResourceId,
        ArrayList<PlaylistItem> data) {
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    previous=newButton(context);
    this.context = context;
    this.data = data;

}

....
....

@Overridepublic View getView(int position, View convertView, ViewGroup parent) {

    pl = newPlaylistItem();
    aud = getItem(position);

    if (convertView == null) {
        LayoutInflaterinflater= ((Activity) context).getLayoutInflater();
        convertView = inflater.inflate(layoutResourceId, parent, false);
        pl.btnPlay = (Button) convertView.findViewById(R.id.btn_list_play);
pl.btnPlay.setBackGroundResouce(R.drawable.button_play); //you can set here or in xml

        pl.imgSaved = (ImageView) convertView
                .findViewById(R.id.img_list_audio_saved);
        pl.tvArtist = (TextView) convertView
                .findViewById(R.id.tvListItemArtist);
        pl.tvTitle = (TextView) convertView
                .findViewById(R.id.tvListItemSong);

        convertView.setTag(pl);
    } else {
        pl = (PlaylistItem) convertView.getTag();
    }


    pl.tvArtist.setText(aud.getArtist() + " " + "-");
    pl.tvTitle.setText(aud.getTitle());

    pl.btnPlay.setOnClickListener(newView.OnClickListener() {
        @OverridepublicvoidonClick(View v) {
            /*--- vibrate if this option is enabled in the preferences ---*/if (APP_CONSTANTS.isHapticFeedbackEnabled(getContext())) {
                APP_CONSTANTS.doVibrate(getContext());
            }
                //for some reason, the background gets changed for every 11th or 12th button in the list
             Button current=((Button)v);
              current.setSelected(true);
              previous.setSelected(false);
              previous=current;
        }
    });

    return convertView;
}

    }

The reason why your button and listitem not clickable is because Your list have a focus item button, so you need to setFocusable=false for your button. Try setting focusable=false for your button in the xml. If it is not worked for you than do like this

In your row xml file

1.set focusable=true for your button. 2.In the same set android:descendantFocusability="blocksDescendants" for your parent item.(i.e parent layout in which your views lie).

In getView() method after setting the onclickListener for the button, set focusable false for the button. It will work for sure. I hope this will help you..

Solution 2:

BUT a click on a certain button forces the background of every 11th or 12th button to be changed. Can't figure it out so far.

You are fighting the way ListViews recycle the row layouts. Think of it this way: if you have a ListView with 10,000 rows but can only fit 9 of them on the screen, then it doesn't make sense to create 10,000 unique layouts. This just waste resources, instead ListView only creates ~10 layouts and reuses them.

Answer : return each row to it's default state when it is reused. In getView() add:

} else {
    pl = (PlaylistItem) convertView.getTag();
    pl.btnPlay.setBackgroundResource(R.drawable.list_button_play);
    // I guessed at the resource's name         ^^^^^^^^^^^^^^^^
}

(Also you can make a few small changes to speed up your code. For instance, you only need one OnClickListener since they all contain the same code, make this a class variable and pass this to each play Button. There are more.)

Post a Comment for "Android - Identify Items In A Listview"