Anshuman Pattnaik
Anshuman Pattnaik

Reputation: 933

How to make listview selected one item element?

I am working on the custom Listview using BaseAdapter. I am facing one small issue after tap on listview item that particular row gets highlighted but after that if i'll tap one another list item it's highlighted but still the older one it remains same it's not going to it's previous state.

I want to see one item should select at one time.

enter image description here

MainActivity.java

if (musicRealmResults.get(currentIndex).isSelected() == false) {
    musicRealmResults.get(currentIndex).setIsSelected(true);

    playSong(currentIndex, true);

    adapter.notifyDataSetChanged();
} else {
    musicRealmResults.get(currentIndex).setIsSelected(false);
    adapter.notifyDataSetChanged();
}

MusicAdapter.java

if (musicRealmResults.get(position).isSelected()) {

    Typeface tf = Typeface.createFromAsset(mContext.getAssets(), "fonts/fonts_bold.otf");
    holder1.albumsTextView.setTypeface(tf);

    holder1.equalizerView.setVisibility(View.VISIBLE);
    holder1.albumsImageView.setVisibility(View.INVISIBLE);
    holder1.equalizerView.animateBars();
} else {
    Typeface tf = Typeface.createFromAsset(mContext.getAssets(), "fonts/fonts_regular.otf");
    holder1.albumsTextView.setTypeface(tf);

    holder1.equalizerView.setVisibility(View.GONE);
    holder1.albumsImageView.setVisibility(View.VISIBLE);
    holder1.equalizerView.stopBars();
}

Please kindly go through my post and suggest me how to do select and deselect in a listview row.

Upvotes: 0

Views: 1835

Answers (5)

Anuj Sharma
Anuj Sharma

Reputation: 4324

You can manage this in your model class. Just make a toggle Boolean isSelected with its getter and setter, When user tap on list item check whether its already selected or not, if not then mark it as selected and update the Boolean value in your model class.

mListLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(list.get(position).getisSelected()){
                    // list item is already selected.
                    mListLayout.setBackgroundColor(Color.WHITE);  // normal color
                    list.get(position).setisSelected(false);
                }
                else{
                    // list item is not selected, make it selected
                    mListLayout.setBackgroundColor(Color.GRAY);  // selected color
                    list.get(position).setisSelected(true);
                }
                notifyDataSetChanged();
            }
        });

Upvotes: 0

D Agrawal
D Agrawal

Reputation: 471

This is a good alternative too, if u dont want to loop through the rest of positions to deselect them.

int prevSelection =-1; //nothing selected

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (prevSelection==-1) //nothing selected
                    { 
                      musicRealmResults.get(position).setIsSelected(true);
                      adapter.notifyDataSetChanged();
                      prevSelection = position;
                   }else if (prevSelection == position) //deselect previously selected
                   {
                    musicRealmResults.get(position).setIsSelected(false);
                    adapter.notifyDataSetChanged();
                    prevSelection = -1;
               }else // Some other selection
                  {
                  musicRealmResults.get(prevSelection).setIsSelected(false);
                   musicRealmResults.get(position).setIsSelected(true);
                  adapter.notifyDataSetChanged();
                  prevSelection = position;
}

Upvotes: 1

ekouChiq
ekouChiq

Reputation: 254

Seems that you weren't able to setSelected(false) your previous item. Please check setChoiceMode() of ListView or you may just reset your previous item to setSelected(false).

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    musicRealmResults.get(currentSelected).setIsSelected(false); //Reset previous
     currentSelected = position; //Save currentPosition to for reset later
    .....todos
}

Upvotes: 1

Android Geek
Android Geek

Reputation: 9225

Try Below Code:

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
        {
           if (musicRealmResults.get(position).isSelected() == false)
           {
              musicRealmResults.get(position).setIsSelected(true);

              playSong(position, true);

              adapter.notifyDataSetChanged();
           }
           else 
           {
              musicRealmResults.get(position).setIsSelected(false);
              adapter.notifyDataSetChanged();
           }

        }
    });

Upvotes: 0

user5703518
user5703518

Reputation:

Loop through all your array elements and set check state to false, then set currentIndex to true.

MainActivity

for(int i =0 ; i < musicRealmResults.size() ; ++i){
   musicRealmResults.get(i).setIsSelected(false);
}

musicRealmResults.get(currentIndex).setIsSelected(true);

playSong(currentIndex, true);

adapter.notifyDataSetChanged();

Upvotes: 1

Related Questions