Question

It can be the copy of the same question what I asked some couple of days ago: this. I received one answer there that almost met my requirement but not totally. I am again posting this because I want to have attention of you guys. Sorry for that. In Activity class.

    try {
        training.setTime(new SimpleDateFormat("MM-dd-yyyy HH:mm")
                .parse(strDateTime));

        long difference = training.getTimeInMillis()
                - now.getTimeInMillis();

        if (difference < 15 * 60 * 1000) { // less than 15 minutes

            TrainingAdapter.ViewHolder.status = 1;
            trainingAdapter.notifyDataSetChanged();

            Intent intent = new Intent(getApplicationContext(),
                    TraineeListActivity.class);
            MainActivity.this.startActivity(intent);

            finish();

        } else {

            TrainingAdapter.ViewHolder.status = 1;
            Toast.makeText(
                    getApplicationContext(),
                    "The training starts on" + " " + trainingStartDate
                            + " at " + trainingStartTime,
                    Toast.LENGTH_SHORT).show();
        }
    } catch (java.text.ParseException e) {
        e.printStackTrace();
    }

In Adapter class;

public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder;
    int tmp_status = 0;

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.trainingadapter, null);

        holder = new ViewHolder();
        holder.txtName = (TextView) convertView
                .findViewById(R.id.training_title);
        holder.trainingDetails = (TextView) convertView
                .findViewById(R.id.training_dtls);
        holder.lockImage = (ImageView) convertView
                .findViewById(R.id.lockImage);

        convertView.setTag(holder);

    } else {
        holder = (ViewHolder) convertView.getTag();
        tmp_status = ViewHolder.status;
    }
    holder.txtName.setText(trainingsList.get(position).getTitle());

    holder.trainingDetails.setText("In "
            + trainingsList.get(position).getLocation() + " on "
            + trainingsList.get(position).getDate() + " at "
            + trainingsList.get(position).getStartTime() + " - "
            + trainingsList.get(position).getEndTime() + " by "
            + trainingsList.get(position).getTrainer());

    if (tmp_status == 0) {
        System.out.println(tmp_status);
        holder.lockImage.setBackgroundResource(R.drawable.unlock);

    } else if (tmp_status == 1) {
        System.out.println(tmp_status);
        holder.lockImage.setBackgroundResource(R.drawable.lock);
    }

    return convertView;
}

static class ViewHolder {

    TextView trainingDetails;
    TextView txtName;
    ImageView lockImage;
    public static int status;

}

Here, the image is changing according to the value of int tmp_status = 0; . If I initialize value to 1, only it gives another image but to all list views. In Activity class you can see the conditions of each list is different i.e. intent to another activity. Could you figure out where is the problem.

Was it helpful?

Solution 2

Ok I managed to do it in this way;

Im model class;

public boolean isLocked() {

    boolean returnCode = true;
    // current date & time
    Calendar now = Calendar.getInstance();

    // parse date & time from database
    String trainingStartDate = this.getDate();

    String trainingStartTime = this.getStartTime();

    String strDateTime = trainingStartDate + " " + trainingStartTime;

    Calendar training = Calendar.getInstance();

    try {
        training.setTime(new SimpleDateFormat("MM-dd-yyyy HH:mm")
                .parse(strDateTime));

        long difference = training.getTimeInMillis()
                - now.getTimeInMillis();

        if (difference < 15 * 60 * 1000) { // less than 15 minutes


            returnCode = false;
        }

    } catch (java.text.ParseException e) {
        e.printStackTrace();
        //returnCode = false;
    }

    return returnCode;  
}

In Activity class;

private void startTraining() {

    // parse date & time from database
    String trainingStartDate = SharedMemory.getInstance()
        .getCurrentTraining().getDate();

    String trainingStartTime = SharedMemory.getInstance()
            .getCurrentTraining().getStartTime();

    if ((currentTraining).isLocked()){
        Toast.makeText(
                getApplicationContext(),
                "The training starts on" + " " + trainingStartDate
                        + " at " + trainingStartTime,
                Toast.LENGTH_SHORT).show();
    }else{
        Intent intent = new Intent(getApplicationContext(),
                TraineeListActivity.class);
        MainActivity.this.startActivity(intent);

        finish();

    }
}

In Adapter class;

// If training is locked, then display the lock picture
    if (trainingsList.get(position).isLocked()) {

        holder.lockImage.setBackgroundResource(R.drawable.lock);

        // else display the unlock picture
    } else {

        holder.lockImage.setBackgroundResource(R.drawable.unlock);
    }

OTHER TIPS

Remove Status variable from ViewHolder. ViewHolder is only for views. You have to keep status saperatly for each row.It can be List of Integer or List of Pojo's.

public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder;
    int tmp_status = 0;

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.trainingadapter, null);

        holder = new ViewHolder();
        holder.txtName = (TextView) convertView
                .findViewById(R.id.training_title);
        holder.trainingDetails = (TextView) convertView
                .findViewById(R.id.training_dtls);
        holder.lockImage = (ImageView) convertView
                .findViewById(R.id.lockImage);

        convertView.setTag(holder);

    } else {
        holder = (ViewHolder) convertView.getTag(); 
    }
    tmp_status = listOfStatuses.get(position);
    holder.txtName.setText(trainingsList.get(position).getTitle());

    holder.trainingDetails.setText("In "
            + trainingsList.get(position).getLocation() + " on "
            + trainingsList.get(position).getDate() + " at "
            + trainingsList.get(position).getStartTime() + " - "
            + trainingsList.get(position).getEndTime() + " by "
            + trainingsList.get(position).getTrainer());

    if (tmp_status == 0) {
        System.out.println(tmp_status);
        holder.lockImage.setBackgroundResource(R.drawable.unlock);

    } else if (tmp_status == 1) {
        System.out.println(tmp_status);
        holder.lockImage.setBackgroundResource(R.drawable.lock);
    }

    return convertView;
}

static class ViewHolder {

    TextView trainingDetails;
    TextView txtName;
    ImageView lockImage;

}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top