2014-02-17 4 views
0

Это может быть копия того же вопроса, что я спросил несколько дней назад: this. Я получил там один ответ, который почти соответствовал моему требованию, но не полностью. Я снова отправляю это, потому что хочу обратить ваше внимание на вас, ребята. Простите за это. В классе деятельности.Измените изображение в ListView автоматически в соответствии с условиями

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

В Класс адаптера;

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; 

} 

Здесь изображение меняется в зависимости от значения Int tmp_status = 0;. Если я инициализирую значение 1, только он дает другое изображение, но для всех видов списка. В классе Activity вы можете видеть, что условия каждого списка различны, т. Е. Намерение другой деятельности. Не могли бы вы выяснить, где проблема.

+0

FYI, статус - статическая переменная, что означает, что это будет только один экземпляр для вашего класса. Итак, ваш TrainingAdapter.ViewHolder.status = 1; 1 для всех строк списка – Pankaj

+0

Невозможно установить разные изображения в разных списках? – bShah

ответ

0

Хорошо, мне удалось сделать это таким образом;

Im модельный класс;

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

В классе деятельности;

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(); 

    } 
} 

В Класс адаптера;

// 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); 
    } 
0

Удалить переменную статуса из ViewHolder. ViewHolder предназначен только для просмотра. Вы должны сохранять статус saperatly для каждой строки. Он может быть List of Integer или List of Pojo.

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; 

} 
+0

Если я удалю это, как я могу установить условие в классе активности? например, там, в одном условии состояние равно 0, а в другом состоянии состояние равно 1. – bShah

+0

Как я уже сказал, вам нужно сохранить статус в ArrayList из Integer для каждой позиции списка и проверить его в geview – Pankaj

+0

Проверить, что «listOfStatuses» - это вам необходимо создать и передать его в Adapter. – Pankaj

Смежные вопросы