简体   繁体   English

更改ListView的一行的图标

[英]Change the icon of one row of a ListView

I am displaying some rows in my ListView and want to change only one of the row, by seeing if any of the date in the list matches today's date. 我在ListView显示一些行,并希望仅更改其中的一行,方法是查看列表中的任何日期是否与今天的日期匹配。

My partial code is: 我的部分代码是:

DateFormat df = new SimpleDateFormat("EEEEE, LLLL d", Locale.US);
String[] suspendedDates = {
    "Tuesday, January 1",
    "Wednesday, April 16",
    "Monday, October 6",
    "Wednesday, December 25"
};

lvDisplay = (ListView) findViewById(R.id.lvDisp);

        for (int i = 0; i < suspendedDates.length; i ++) {
            sDate = suspendedDates[i];
            sReason = datesReason[i];
            if (Arrays.asList(suspendedDates).contains(df.format(Calendar.getInstance(Locale.US).getTime()))) {
                inIconShow = R.drawable.caliconpressed; //if today matches display a different drawable
                contents.add(new SetRows(inIconShow, sDate, sReason));
            }
            if (!Arrays.asList(suspendedDates).contains(df.format(Calendar.getInstance(Locale.US).getTime()))) {
                inIconShow = R.drawable.calicon; //if today doesn't match the array display the default drawable
                contents.add(new SetRows(inIconShow, sDate, sReason));
            }
        }
        // Now set your adapter.
        adapter = new SetRowsCustomAdapter(MainActivity.this, R.layout.listdates, contents);
        lvDisplay.setAdapter(adapter);

SetRowsCustomAdapter class: SetRowsCustomAdapter类:

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class SetRowsCustomAdapter extends ArrayAdapter<SetRows> {
    Context context;
   int layoutResourceId;
   ArrayList<SetRows> data=new ArrayList<SetRows>();
   public SetRowsCustomAdapter(Context context, int layoutResourceId, ArrayList<SetRows> data) {
       super(context, layoutResourceId, data);
       this.layoutResourceId = layoutResourceId;
       this.context = context;
       this.data = data;
   }

   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
       View row = convertView;
       ImageHolder holder = null;

       if(row == null)
       {
           LayoutInflater inflater = ((Activity)context).getLayoutInflater();
           row = inflater.inflate(layoutResourceId, parent, false);

           holder = new ImageHolder();
           holder.txtTitle = (TextView)row.findViewById(R.id.tvDateVal);
           //holder.txtTitle.setTypeface(Typeface.createFromAsset(getContext().getAssets(), "fonts/robm.ttf"));
           holder.imgIcon = (ImageView)row.findViewById(R.id.ivIcon0);
           holder.txtID = (TextView)row.findViewById(R.id.tvReasonVal);
           //holder.txtID.setTypeface(Typeface.createFromAsset(getContext().getAssets(), "fonts/robm.ttf"));
           row.setTag(holder);
       }
       else
       {
           holder = (ImageHolder)row.getTag();
       }

       SetRows myImage = data.get(position);
       holder.txtTitle.setText(myImage.name);
       holder.txtID.setText(myImage.id);
       int outImage=myImage.image;
       holder.imgIcon.setImageResource(outImage);
      return row;

   }

   static class ImageHolder
   {
       ImageView imgIcon;
       TextView txtTitle;
       TextView txtID;
   }
}

So the 4th row should have a different icon and the other 3 should have default icon. 因此,第四行应具有不同的图标,其他三行应具有默认图标。 What is happening is if the date matches, every row has the different icon, otherwise every row has the default icon. 发生的情况是,如果日期匹配,则每一行都有不同的图标,否则每一行都有默认的图标。

How do I fix it? 我如何解决它?

if you want change the image you can do in getView method like bellow code: 如果要更改图像,可以在以下波纹管代码的getView方法中执行:

@Override
   public View getView(int position, View convertView, ViewGroup parent) {
       View row = convertView;
       ImageHolder holder = null;

       if(row == null)
       {
           LayoutInflater inflater = ((Activity)context).getLayoutInflater();
           row = inflater.inflate(layoutResourceId, parent, false);

           holder = new ImageHolder();
           holder.txtTitle = (TextView)row.findViewById(R.id.tvDateVal);
           //holder.txtTitle.setTypeface(Typeface.createFromAsset(getContext().getAssets(), "fonts/robm.ttf"));
           holder.imgIcon = (ImageView)row.findViewById(R.id.ivIcon0);
           holder.txtID = (TextView)row.findViewById(R.id.tvReasonVal);
           //holder.txtID.setTypeface(Typeface.createFromAsset(getContext().getAssets(), "fonts/robm.ttf"));
           row.setTag(holder);
       }
       else
       {
           holder = (ImageHolder)row.getTag();
       }

       SetRows myImage = data.get(position);
       holder.txtTitle.setText(myImage.name);
       holder.txtID.setText(myImage.id);
       int outImage=myImage.image;
       if (data.getValue)
          holder.imgIcon.setImageResource(deferentIcon);
       else
          holder.imgIcon.setImageResource(defaultIcon);
      return row;

   }

and if you want change multi row icons you can send one list of your row and check in that, and for refresh you list use adapter.notifyDataSetChanged() 如果您想更改多行图标,则可以发送一行列表并签入,要刷新列表,请使用adapter.notifyDataSetChanged()

Edit 编辑

for your situation you can add on boolean value in your DS and if date equal set true otherwise set else that and in if statement check that 根据您的情况,您可以在DS中添加布尔值,如果date等于true设置为true,否则设置else并在if语句中检查

Use viewHolder in adapter then use notifyDataSetChanged() in adapter; 在适配器中使用viewHolder,然后在适配器中使用notifyDataSetChanged(); I already used and it will help. 我已经使用过,它将有所帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM