문제

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.

도움이 되었습니까?

해결책 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);
    }

다른 팁

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;

}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top