Search code examples
androidlistviewcustom-adapter

How to disable previous items in a ListView


I am trying to develop an activity where there is a custom listView made out of CustomAdapter.

The list consists of a TextView and an EditText. The EditText when clicked, it auto fetches the system time.

What I want is when a particular EditText is filled, I want all the previous(above) list items in the sequence to be disabled.

So far, I have tried using isEnabled() and areAllItemsEnabled() functions returning respective boolean values using position, but however didn’t work.

Please help me achieve the above. enter image description here

Thanks.

This is my CustomAdapter Class

public class SelectStnListByRoute extends BaseAdapter implements View.OnClickListener {
    Context context;
    ArrayList<StnNames> stnList;
    LayoutInflater layoutInflater = null;
    ViewHolder viewHolder;
    private int mLastClicked;

    public SelectStnListByRoute(Context context, ArrayList<StnNames> stnList) {
        super();
        this.context = context;
        this.stnList = stnList;
        layoutInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return stnList.size();
    }

    @Override
    public Object getItem(int position) {
        return stnList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return stnList.indexOf(getItem(position));
    }

    public int getViewTypeCount() {
        return 1;
    }

    @Override
    public boolean areAllItemsEnabled() {
        return false;
    }

    @Override
    public boolean isEnabled(int position) {
        if(position==position){
            return false;
        }
        return false;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup viewGroup) {
        int type = getItemViewType(position);
        StnNames stnDetails = stnList.get(position);
        viewHolder = new ViewHolder();
        if (convertView == null) {
            convertView = layoutInflater.inflate(R.layout.footplate_custome_layout, null);
            viewHolder.txtStnNAme = (TextView) convertView.findViewById(R.id.txtStnCode);
            viewHolder.txtStnArr = (TextView) convertView.findViewById(R.id.txtArrivalTime);
            viewHolder.txtStnDep = (TextView) convertView.findViewById(R.id.txtDepTime);
            convertView.setTag(viewHolder);
            viewHolder.txtStnArr.setTag(stnDetails);
            viewHolder.txtStnDep.setTag(stnDetails);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
            viewHolder.txtStnArr.setTag(stnDetails);
            viewHolder.txtStnDep.setTag(stnDetails);
        }
        viewHolder.txtStnNAme.setText(stnDetails.getStnCode());

          viewHolder.txtStnArr.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Log.e("Position: " , String.valueOf(position)); //Here I am getting the position of the row item clicked, where should I put the Onclick false for disabling all of the above fields using the position?
        }
    });
        viewHolder.txtStnDep.setOnClickListener(this);
        viewHolder.txtStnArr = (TextView) convertView.findViewById(R.id.txtArrivalTime);
        if (stnDetails.getArrivalTime() != null) {
            viewHolder.txtStnArr.setText(stnDetails.getArrivalTime());
        } else {
            viewHolder.txtStnArr.setText("");
        }


        if (stnDetails.getDeptTime() != null) {
            viewHolder.txtStnDep.setText(stnDetails.getDeptTime());
        } else {
            viewHolder.txtStnDep.setText("");
        } 
        return convertView;
    }

    class ViewHolder {
        TextView txtStnNAme, txtStnArr, txtStnDep;
        int ref;
    }


    @Override
    public void onClick(View view) {
        int id = view.getId();

        switch (id) {
            case txtArrivalTime:
                TextView textViewArrVal = (TextView) view.findViewById(R.id.txtArrivalTime);
                textViewArrVal.setClickable(false);
                StnNames listItemsArrr = (StnNames) textViewArrVal.getTag();
                if (listItemsArrr.getArrivalTime() != getCurrentTime()) {
                    listItemsArrr.setArrivalTime(getCurrentTime());
                    if (listItemsArrr.getArrivalTime() != null) {
                        int position = textViewArrVal.getSelectionStart();
                        textViewArrVal.setText(listItemsArrr.getArrivalTime());

                    } else {
                        textViewArrVal.setText("");
                    }
                }
                break;
            case txtDepTime:
                TextView textViewDepVal = (TextView) view.findViewById(R.id.txtDepTime);
                StnNames listItemsDepp = (StnNames) textViewDepVal.getTag();
                if (listItemsDepp.getDeptTime() != getCurrentTime()) {
                    listItemsDepp.setDeptTime(getCurrentTime());
                    if (listItemsDepp.getDeptTime() != null) {
                        textViewDepVal.setText(listItemsDepp.getDeptTime());
                    } else {
                        textViewDepVal.setText("");
                    }
                }
                break;
            default:
                break;
        }

    }
    public String getCurrentTime(){

        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat mdformat = new SimpleDateFormat("HH:mm:ss");
        String arrDate = mdformat.format(calendar.getTime());
        return arrDate;
    }

}


Solution

  • You can do this as below mentioned -:

    You need to store the position of clicked button was. So initialize a variable in your class

    int mButtonSelected = -1;
    

    EDIT 1.

    Then make a change to your isEnabled method

     @Override
    public boolean isEnabled(int position) {
        if(position<mButtonSelected){
            return false;
        }
        return true;
    }
    

    That will work it if any other button was clicked. but you have to do that in your onClick

    mButtonSelected = position;
    notifyDataSetChanged();
    

    Let me it worked or not

    EDIT

    see below changes in your code-:

    public class SelectStnListByRoute extends BaseAdapter {
    Context context;
    ArrayList<StnNames> stnList;
    LayoutInflater layoutInflater = null;
    ViewHolder viewHolder;
    private int mLastClicked;
    private SQLiteDB sqLiteDB;
    int mArrivalSelected = -1;
    int mDepartSelected = -1;
    
    public SelectStnListByRoute(Context context, ArrayList<StnNames> stnList) {
        super();
        this.context = context;
        this.stnList = stnList;
        layoutInflater = LayoutInflater.from(context);
        sqLiteDB = new SQLiteDB(context);
    }
    
    @Override
    public int getCount() {
        return stnList.size();
    }
    
    @Override
    public Object getItem(int position) {
        return stnList.get(position);
    }
    
    @Override
    public long getItemId(int position) {
        return stnList.indexOf(getItem(position));
    }
    
    public int getViewTypeCount() {
        return 1;
    }
    
    @Override
    public boolean areAllItemsEnabled() {
        return false;
    }
    
    @Override
    public boolean isEnabled(int position) {
        if (position <= mArrivalSelected) {
            return false;
        }
        return true;
    }
    
    public boolean isEnabledd(int position) {
        if (position <= mDepartSelected) {
            return false;
        }
        return true;
    }
    
    @Override
    public View getView(final int position, View convertView, ViewGroup viewGroup) {
        int type = getItemViewType(position);
        StnNames stnDetails = stnList.get(position);
        viewHolder = new ViewHolder();
        if (convertView == null) {
            convertView = layoutInflater.inflate(R.layout.footplate_custome_layout, null);
            viewHolder.txtStnNAme = (TextView) convertView.findViewById(R.id.txtStnCode);
            viewHolder.txtStnArr = (TextView) convertView.findViewById(R.id.txtArrivalTime);
            viewHolder.txtStnDep = (TextView) convertView.findViewById(R.id.txtDepTime);
            convertView.setTag(viewHolder);
            viewHolder.txtStnArr.setTag(stnDetails);
            viewHolder.txtStnDep.setTag(stnDetails);
    
    
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
            viewHolder.txtStnArr.setTag(stnDetails);
            viewHolder.txtStnDep.setTag(stnDetails);
    
        }
    
    
        viewHolder.txtStnNAme.setText(stnDetails.getStnCode());
        if (!isEnabled(position)) {
            if (position <= mArrivalSelected) {
                viewHolder.txtStnArr.setBackgroundColor(Color.parseColor("#ffa500"));
                viewHolder.txtStnArr.setEnabled(false);
                if (position < mArrivalSelected) {
                    viewHolder.txtStnDep.setEnabled(false);
                    viewHolder.txtStnDep.setBackgroundColor(Color.parseColor("#ffa500"));
                }
            }
        } else {
            viewHolder.txtStnArr.setEnabled(true);
            viewHolder.txtStnDep.setEnabled(true);
            viewHolder.txtStnArr.setBackgroundColor(Color.parseColor("#b4b4b4"));
            viewHolder.txtStnDep.setBackgroundColor(Color.parseColor("#b4b4b4"));
        }
        viewHolder.txtStnArr.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.e("Position: ", String.valueOf(position));
                mArrivalSelected = position;
                arrivalClick(view);
                notifyDataSetChanged();
            }
        });
        if (!isEnabledd(position)) {
            if (position <= mDepartSelected) {
                viewHolder.txtStnArr.setBackgroundColor(Color.parseColor("#ffa500"));
                viewHolder.txtStnDep.setBackgroundColor(Color.parseColor("#ffa500"));
                viewHolder.txtStnArr.setEnabled(false);
                viewHolder.txtStnDep.setEnabled(false);
            } else {
                viewHolder.txtStnArr.setEnabled(true);
                viewHolder.txtStnDep.setEnabled(true);
                viewHolder.txtStnArr.setBackgroundColor(Color.parseColor("#b4b4b4"));
                viewHolder.txtStnDep.setBackgroundColor(Color.parseColor("#b4b4b4"));
            }
        }
        viewHolder.txtStnDep.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.e("Position: ", String.valueOf(position));
                mDepartSelected = position;
                departureClick(view);
                notifyDataSetChanged();
            }
        });
        viewHolder.txtStnArr = (TextView) convertView.findViewById(R.id.txtArrivalTime);
        if (stnDetails.getArrivalTime() != null) {
            viewHolder.txtStnArr.setText(stnDetails.getArrivalTime());
        } else {
            viewHolder.txtStnArr.setText("");
        }
    
    
        if (stnDetails.getDeptTime() != null) {
            viewHolder.txtStnDep.setText(stnDetails.getDeptTime());
        } else {
            viewHolder.txtStnDep.setText("");
        }
    
        return convertView;
    }
    
    class ViewHolder {
        TextView txtStnNAme, txtStnArr, txtStnDep;
        StnNames pos;
        int ref;
    }
    
    public void arrivalClick(View view) {
        TextView textViewArrVal = (TextView) view.findViewById(R.id.txtArrivalTime);
    
        StnNames listItemsArrr = (StnNames) textViewArrVal.getTag();
        if (listItemsArrr.getArrivalTime() != getCurrentTime()) {
            listItemsArrr.setArrivalTime(getCurrentTime());
            int stnId = listItemsArrr.getStnId();
            String arrClick = "arrival";
            String upSideKm = listItemsArrr.getStnUpsideKm();
            String downsideKm = listItemsArrr.getStnDownSideKm();
            String arrTime = getCurrentTime();
               /*     sqLiteDB.open();
                   *//* long abc = sqLiteDB.insertJourneySchedule(stnId,arrTime,"",userId,journeyId,latitute,longitute,journyDate,arrClick);*//*
                   *//* long abcd = sqLiteDB.updateJourneySchedule(stnId,arrTime,"",userId,journeyId,latitute,longitute,journyDate,arrClick,downsideKm,upSideKm);
                    Log.e("arrclick",String.valueOf(abcd));*//*
                    sqLiteDB.close();*/
            if (listItemsArrr.getArrivalTime() != null) {
                int position = textViewArrVal.getSelectionStart();
                textViewArrVal.setText(listItemsArrr.getArrivalTime());
    
            } else {
                textViewArrVal.setText("");
            }
        }
    }
    
    public void departureClick(View view) {
        TextView textViewDepVal = (TextView) view.findViewById(R.id.txtDepTime);
        StnNames listItemsDepp = (StnNames) textViewDepVal.getTag();
        if (listItemsDepp.getDeptTime() != getCurrentTime()) {
            listItemsDepp.setDeptTime(getCurrentTime());
            String depTime = getCurrentTime();
            int stnId = listItemsDepp.getStnId();
            String depClick = "departure";
            String upSideKm = listItemsDepp.getStnUpsideKm();
            String downsideKm = listItemsDepp.getStnDownSideKm();
            sqLiteDB.open();
                    /*long abc = sqLiteDB.insertJourneySchedule(stnId,"",depTime,userId,journeyId,latitute,longitute,journyDate,depClick);*/
                    /*long abcd = sqLiteDB.updateJourneySchedule(stnId,"",depTime,userId,journeyId,latitute,longitute,journyDate,depClick,downsideKm,upSideKm);
                    Log.e("depclick",String.valueOf(abcd));*/
            sqLiteDB.close();
            if (listItemsDepp.getDeptTime() != null) {
                textViewDepVal.setText(listItemsDepp.getDeptTime());
            } else {
                textViewDepVal.setText("");
            }
        }
    }
    
    
    
    public String getCurrentTime() {
    
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat mdformat = new SimpleDateFormat("HH:mm:ss");
        String arrDate = mdformat.format(calendar.getTime());
        return arrDate;
    }
    
    }