【问题标题】:Change the image in ListView automatically according to the conditions根据条件自动改变ListView中的图片
【发布时间】:2014-02-17 12:10:21
【问题描述】:

这可能是我几天前提出的同一个问题的副本: this。我在那里收到了一个几乎满足我要求但不完全满足的答案。我再次发布此内容是因为我想引起你们的注意。对此感到抱歉。 在 Activity 类中。

    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 类中,您可以看到每个列表的条件不同,即对另一个活动的意图。你能找出问题出在哪里吗?

【问题讨论】:

  • 仅供参考,status 是静态变量,这意味着它只是您班级的一个实例。所以你的 TrainingAdapter.ViewHolder.status = 1;列表视图的所有行都为 1
  • 不可以在不同的listViews中设置不同的图片吗??

标签: android listview conditional-statements baseadapter


【解决方案1】:

从 ViewHolder 中移除 Status 变量。 ViewHolder 仅用于视图。 您必须为每一行单独保留状态。它可以是整数列表或 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,在另一种情况下状态为 1。
  • 就像我说的,你必须为列表的每个位置将状态存储在 Integer 的 ArrayList 中,并在 geview 中检查
  • 检查“listOfStatuses”是您必须创建的列表并将其传递给适配器。
  • 你的意思是 listOfStatuses 将是我的图像的数组列表
  • 不,它将是状态 int 的数组列表
【解决方案2】:

好的,我设法以这种方式做到了;

我是模型类;

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

在Activity类中;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 2022-12-23
    • 2020-01-02
    • 1970-01-01
    • 2012-08-05
    相关资源
    最近更新 更多