Search code examples
androidlistviewonitemselectedlistener

Android ListView how to update the view on unselected


I have a ListView in which I want to change the selected row to a different color but reset it to the original color when its unselected. I use onItemSelectedListener to set the color, which works fine, but how can I reset the color after it gets unselected?

Thanks.


Solution

  • Create Listener Interface:

    public interface ListListener {
         void clickListItem(int position);
    }
    

    Here is Model class:

    public class Route {
        String studentName;
        boolean colorRed;
    
        public Route(String studentName, boolean colorRed) {
            this.studentName=studentName;
            this.colorRed=colorRed;
        }
    
        public String getStudentName() {
            return studentName;
        }
    
        public void setStudentName(String studentName) {
            this.studentName = studentName;
        }
    
        public boolean isColorRed() {
            return colorRed;
        }
    
        public void setColorRed(boolean colorRed) {
            this.colorRed = colorRed;
        }
    }
    

    Create Adapter class:

    public class AAdapter  extends BaseAdapter implements View.OnClickListener {
    
        Context context;
        private List<Route> routes;
        Holder holder;
        private static LayoutInflater inflater=null;
        ListListener listListener;
    
        public AAdapter(Context context, List<Route> names,ListListener listListener) {
           this.routes=names;
            this.context=context;
            this.listListener=listListener;
            inflater = ( LayoutInflater )context.
                    getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
    
        @Override
        public void onClick(View view) {
            listListener.clickListItem((Integer)view.getTag());
        }
    
        private class Holder
        {
            TextView tv;
        }
    
        @Override
        public Route getItem(int position) {
            return routes.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public int getCount() {
            return routes.size();
        }
    
        @NonNull
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
    
            if (convertView==null){
                holder=new Holder();
    
                convertView=inflater.inflate(R.layout.custom_layout,null);
    
                holder.tv=(TextView)convertView.findViewById(R.id.textView);
                holder.tv.setOnClickListener(this);
                convertView.setTag(holder);
    
            }else {
                holder=(Holder)convertView.getTag();
            }
    
            holder.tv.setText(routes.get(position).getStudentName());
            holder.tv.setTag(position);
    
            if (!routes.get(position).colorRed){
                holder.tv.setBackgroundColor(Color.GREEN);
            }else {
                holder.tv.setBackgroundColor(Color.RED);
            }
            return convertView;
        }
    }
    

    Now MainActivity Class:

    public class MainActivity extends AppCompatActivity implements ListListener{
    
        AAdapter adapter;
        ListView lv;
        List<Route> myNames;
        ListListener listListener=MainActivity.this;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            lv=(ListView)findViewById(R.id.listnames);
    
    
            myNames=new ArrayList<>();
    
            /* DEMO DATA U NEED TO FETCH YOUR DATA */
            myNames.add(new Route("FIRST",false));
            myNames.add(new Route("Second",false));
            myNames.add(new Route("Third",false));
            myNames.add(new Route("Fourth",false));
            myNames.add(new Route("Fifth",false));
    
            myNames.add(new Route("FIRST",false));
            myNames.add(new Route("Second",false));
            myNames.add(new Route("Third",false));
            myNames.add(new Route("Fourth",false));
            myNames.add(new Route("Fifth",false));
    
            myNames.add(new Route("FIRST",false));
            myNames.add(new Route("Second",false));
            myNames.add(new Route("Third",false));
            myNames.add(new Route("Fourth",false));
            myNames.add(new Route("Fifth",false));
    
            myNames.add(new Route("FIRST",false));
            myNames.add(new Route("Second",false));
            myNames.add(new Route("Third",false));
            myNames.add(new Route("Fourth",false));
            myNames.add(new Route("Fifth",false));
    
    
            adapter = new AAdapter(this, myNames,listListener);
            lv.setAdapter(adapter);
            adapter.notifyDataSetChanged();
        }
    
        @Override
        public void clickListItem(int position) {
            if(myNames.get(position).colorRed){
               myNames.get(position).colorRed=false;
            }else {
                myNames.get(position).colorRed=true;
            }
            adapter.notifyDataSetChanged();
        }
    }