1

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;
    }

}
UltimateDevil
  • 2,807
  • 2
  • 18
  • 31
An08NY
  • 139
  • 15

2 Answers2

1

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;
}

}
UltimateDevil
  • 2,807
  • 2
  • 18
  • 31
0

Get the position of the row which is clicked and then set onclick false for positions less than clicked position

as follows:

viewHolder.txtStnArr.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Log.e("Position: " , String.valueOf(position)); 
            for (int i = 0; i < position; i++) {
                  viewHolder.txtStnArr.setEnable(false);
             }
             notifyDataSetChanged();
        }
    });
yogesh lokhande
  • 1,245
  • 1
  • 11
  • 20
  • Here, I am getting the position of the row which is clicked. viewHolder.txtStnArr.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.e("Position: " , String.valueOf(position)); } }); Where should I put the onClick false for all the above fields? – An08NY Sep 27 '17 at 07:45
  • In the same listener by using for loop – yogesh lokhande Sep 27 '17 at 08:54