【问题标题】:Insert images in listview of Adapter class according to the condition of Main Activity class根据Main Activity类的条件在Adapter类的listview中插入图片
【发布时间】:2014-02-14 10:22:23
【问题描述】:

你可能觉得我的头衔不清楚。

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

}

为了获得这些培训列表,我使用了扩展 TrainingAdapter 的 BaseAdapter。

我的 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 和另一个图像,当训练尚未准备好开始时。训练开始情况可见活动课。提前感谢您的帮助..

【问题讨论】:

  • 那么你的问题是什么。检查条件并替换图像??
  • 你的意思是在 Activity 类里面 if else 条件我放了两张不同的图片??
  • 在BaseAdapter getview方法中放置条件
  • 我不知道如何实现。如果你能提供一些小代码提示......
  • 我的意思是什么条件??

标签: java android listview android-listview android-adapter


【解决方案1】:

在您的活动中,您必须检查列表中的所有数据。

假设您的数据在 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);

【讨论】:

  • 抱歉,这对我的情况没有帮助。我的其他数据在数据库中。当列表中的条件发生变化时,图像必须自动更改。条件是 startTraining()。
  • 你可以使列表无效
【解决方案2】:

这仅适用于您必须通过选中的列表视图中的一项 项目

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

【讨论】:

  • 但是onClick到listView的startTraining()事件会如何发生?
  • 而 int -1 怎么可能在 else{}block 内。
  • 而且我无法在 TrainingAdapter 类中调用 startTraining() 方法。它要求是在那个时候意图不起作用的静态方法。
  • 对不起,我不明白你在做什么。 1)listview中只有一项??????
  • 您必须在用户点击时通知datasetchanged 方法并更新您的列表视图。所以我认为你必须把 setnotifydatasetchanged 放在 startTraining 方法中
【解决方案3】:

好的,我设法以这种方式回答; 在模型类中;

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

【讨论】:

    猜你喜欢
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多