Вставьте изображения в список класса Adapter в соответствии с условием класса Main Activity.

Мое название может показаться вам неясным.

В связи с новизной в Java и отсутствием логики хочу спросить у вас простую вещь.

У меня есть класс Activity, где есть список тренировок с двумя текстовыми представлениями и одним представлением изображения. OnClick в listView Я хочу перейти к следующему действию в некоторых условиях. Это условие вы можете увидеть ниже в коде.

класс активности;

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {

    currentTraining = (Training) arg0.getAdapter().getItem(arg2);

    SharedMemory.getInstance().setCurrentTraining(currentTraining);

    startTraining();

}

@SuppressLint("SimpleDateFormat")
private void startTraining() throws ParseException {

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

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

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

    String strDateTime = trainingStartDate + " " + trainingStartTime;

    Calendar training = Calendar.getInstance();

    try {
        training.setTime(new SimpleDateFormat("MM-dd-yyyy HH:mm")
                .parse(strDateTime));
    } catch (java.text.ParseException e) {
        e.printStackTrace();
    }

    // find difference in milliseconds
    long difference = training.getTimeInMillis() - now.getTimeInMillis();

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

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

        finish();

    } else {
        Toast.makeText(
                getApplicationContext(),
                "The training starts on" + " " + trainingStartDate + " at "
                        + trainingStartTime, Toast.LENGTH_SHORT).show();
    }

}

Чтобы получить эти списки тренировок, я использую BaseAdapter, который расширяет TrainingAdapter.

Мой класс TrainingAdapter;

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

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

    **HERE-->** holder.lockImage.setBackgroundResource(R.drawable.unlock);

    return convertView;
}

static class ViewHolder {

    TextView trainingDetails;
    TextView txtName;
    ImageView lockImage;

}

В imageView (lockImage) я хочу установить одно изображение в listView, что обучение успеет начаться, и другое изображение, когда обучение не готово к началу. Условие начала тренировки можно увидеть в классе активности. Заранее спасибо за помощь..


person bShah    schedule 14.02.2014    source источник
comment
так в чем твоя проблема. проверить состояние и заменить изображение??   -  person mcd    schedule 14.02.2014
comment
Вы имеете в виду, что в классе активности внутри условия if else я помещаю два разных изображения ??   -  person bShah    schedule 14.02.2014
comment
в методе getview BaseAdapter поставить условие   -  person mcd    schedule 14.02.2014
comment
Я не знаю, как я могу это реализовать. Если бы вы могли небольшой намек на код, пожалуйста..   -  person bShah    schedule 14.02.2014
comment
в смысле в каком состоянии??   -  person bShah    schedule 14.02.2014
comment
метод notifyDataSetChanged() решил вашу проблему   -  person mcd    schedule 14.02.2014
comment
@mcd В вашем ответе изображения отображаются только на ощупь. Я не понимаю почему??   -  person bShah    schedule 17.02.2014
comment
Вы хотите установить другое изображение в зависимости от условия в представлении списка., верно??   -  person SweetWisher ツ    schedule 17.02.2014
comment
@SweetWisherツ Точно!!   -  person bShah    schedule 17.02.2014
comment
Итак, М говорит это только тебе, наа   -  person SweetWisher ツ    schedule 17.02.2014
comment
@SweetWisherツ ????????? что говорить :D я извиняюсь. Я не понимаю тебя сейчас.   -  person bShah    schedule 17.02.2014
comment
Я уже говорил вам установить необходимое изображение в модели данных, а затем передать эту модель данных адаптеру. Я не могу объяснить вам больше ..   -  person SweetWisher ツ    schedule 17.02.2014
comment
успойкойся. Извините, я немного медлительный (Ламповый свет): D Спасибо за помощь. Я дам ему попробовать. На самом деле я пробовал так, как вы сказали, но не помогло. Я получу попробовать :)   -  person bShah    schedule 17.02.2014
comment
проверьте мой ответ .. это просто идея .. Вы должны реализовать фактический код   -  person SweetWisher ツ    schedule 17.02.2014


Ответы (3)


В своей деятельности вы должны проверить все данные в списке.

Предположим, что ваши данные находятся в dataArrayList, выполните итерацию по dataArrayList и соответственно установите изображение:

for(int i=0 ; i< data_size;i++)
{
        if(ur condition)
        {
            //set image 1

           obj.setImage(image1);
        }
        else
        {
            // set image 2
            obj.setImage(image2);
        }
    dataArrayList.add(obj);
}

После того, как все изображения данных установлены, передайте эти данные адаптеру:

TrainingAdapter adapter = new TrainingAdapter(context, dataArrayList) // whtever is ypur argumnets
listView.setAdapter(adapter);
person SweetWisher ツ    schedule 17.02.2014
comment
Извините, это не помогает в моем состоянии. Мои другие данные находятся в базе данных. И изображение должно автоматически меняться при изменении условия в списке. Условие startTraining(). - person bShah; 17.02.2014
comment
Вы можете аннулировать список - person SweetWisher ツ; 17.02.2014

это будет работать только для одного элемента в списке, вам нужно передать выбранный элемент

 public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {

    currentTraining = (Training) arg0.getAdapter().getItem(arg2);

    SharedMemory.getInstance().setCurrentTraining(currentTraining);

   startTraining()

}

@SuppressLint("SimpleDateFormat")
private void startTraining() throws ParseException {

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

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

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

    String strDateTime = trainingStartDate + " " + trainingStartTime;

    Calendar training = Calendar.getInstance();

    try {
        training.setTime(new SimpleDateFormat("MM-dd-yyyy HH:mm")
                .parse(strDateTime));
    } catch (java.text.ParseException e) {
        e.printStackTrace();
    }

    // find difference in milliseconds
    long difference = training.getTimeInMillis() - now.getTimeInMillis();

    if (difference < 15 * 60 * 1000) { // less than 15 minutes
        /**
          training start
        **/       adapter.ViewHolder.status=0;        adapter.notifydatasetchanged();
        Intent intent = new Intent(getApplicationContext(),
                TraineeListActivity.class);
        MainActivity.this.startActivity(intent);

        finish();

    } else {
        Toast.makeText(
                getApplicationContext(),
                "The training starts on" + " " + trainingStartDate + " at "
                        + trainingStartTime, Toast.LENGTH_SHORT).show();      adapter.ViewHolder.status=1;
  adapter.notifydatasetchanged();
      /**
          training remain
        **/
    }

}



   public View getView(int position, View convertView, ViewGroup parent) {
      int tmp_status;  
        ViewHolder holder;
        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=holder.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)
        **HERE-->** holder.lockImage.setBackgroundResource(R.drawable.unlock);
    else
             something
        return convertView;
    }

    static class ViewHolder {

        TextView trainingDetails;
        TextView txtName;
        ImageView lockImage;
        int status;
    }
person mcd    schedule 14.02.2014
comment
но onClick в listView, как произойдет событие startTraining()? - person bShah; 14.02.2014
comment
И как int -1 может быть внутри блока else{}. - person bShah; 14.02.2014
comment
И я не могу вызвать метод startTraining() в классе TrainingAdapter. Он просит, чтобы метод был статическим, намерение которого не работает в это время. - person bShah; 14.02.2014
comment
извините, я не понимаю, что вы пытаетесь сделать. 1) в списке только один элемент????? - person mcd; 14.02.2014
comment
вы должны уведомить метод datasetchanged и обновить свой список при нажатии пользователем. поэтому я думаю, что вам нужно поместить setnotifydatasetchanged в метод startTraining - person mcd; 14.02.2014
comment
да, в представлении списка есть два текстовых представления и одно изображение. Вы можете рассматривать это как отдельный тренинг или как один пункт. - person bShah; 14.02.2014
comment
Ты не понял меня, чувак. Я не хочу ничего менять, когда пользователь нажимает. Я хочу реализовать два изображения в представлении изображения каждого элемента в двух разных ситуациях. Одна ситуация – когда время обучения готово к началу, а другое – когда время обучения еще не готово. - person bShah; 14.02.2014
comment
интервал tmp_status; Он просит инициализировать значение. - person bShah; 14.02.2014
comment
Ваш код работает нормально только при нажатии на список. Я хочу, чтобы в списке были разные изображения, прежде чем онтач. - person bShah; 14.02.2014
comment
передать желаемое изображение только в адаптер - person SweetWisher ツ; 15.02.2014
comment
@SweetWisherツ Я могу делать это как обычно, но я хочу передавать разные изображения в зависимости от условий обучения. Например, когда обучение не готово к началу, используйте одно изображение, а когда обучение готово начать другое изображение. - person bShah; 17.02.2014
comment
да, я знаю, тогда поставьте это условие и установите данные только в адаптере нет - person SweetWisher ツ; 17.02.2014
comment
@SweetWisherツ Извините, я не могу зайти в чат. Я на работе. Он заблокирован. - person bShah; 17.02.2014
comment
Когда вы заполняете список массивов для адаптера. Вы должны проверить условие - person SweetWisher ツ; 17.02.2014
comment
@SweetWisherツ Я считаю, что приведенный здесь ответ должен сработать. И я попытался проверить условие таким образом, используя флаги. Но он работает только после onTouch в списке. Если бы вы могли отредактировать ответ выше - person bShah; 17.02.2014
comment
давайте продолжим это обсуждение в чате - person SweetWisher ツ; 17.02.2014
comment
Я не могу получить доступ к чату отсюда. - person bShah; 17.02.2014
comment
проверю, когда будет время.. немного занят сейчас - person SweetWisher ツ; 17.02.2014

хорошо, мне удалось ответить таким образом; В модельном классе;

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);
}
person bShah    schedule 18.02.2014