2014-05-15 57 views
0

我有一个GridViewAdapter,它创建一个日历以显示来自我的Web服务器的一些事件。Android如何设置GridView中特定项目的颜色

数据加载成功,当一个项目被点击时它显示事件。问题是我需要通过设置项目的背景颜色而不需要点击它们来知道哪些日子有事件发生。

我该如何做到这一点?

这是适配器代码:

public class CalendarAdapter extends BaseAdapter { 
    private Context mContext; 

    private java.util.Calendar month; 
    public GregorianCalendar pmonth; // calendar instance for previous month 
    /** 
    * calendar instance for previous month for getting complete view 
    */ 
    public GregorianCalendar pmonthmaxset; 
    private GregorianCalendar selectedDate; 
    int firstDay; 
    int maxWeeknumber; 
    int maxP; 
    int calMaxP; 
    int lastWeekDay; 
    int leftDays; 
    int mnthlength; 
    String itemvalue, curentDateString; 
    DateFormat df; 

    private ArrayList<String> items; 
    public static List<String> dayString; 
    private View previousView; 

    public CalendarAdapter(Context c, GregorianCalendar monthCalendar) { 
     CalendarAdapter.dayString = new ArrayList<String>(); 
     Locale.setDefault(Locale.US); 
     month = monthCalendar; 
     selectedDate = (GregorianCalendar) monthCalendar.clone(); 
     mContext = c; 
     month.set(GregorianCalendar.DAY_OF_MONTH, 1); 
     this.items = new ArrayList<String>(); 
     df = new SimpleDateFormat("yyyy-MM-dd", Locale.US); 
     curentDateString = df.format(selectedDate.getTime()); 
     refreshDays(); 
    } 

    public void setItems(ArrayList<String> items) { 
     for (int i = 0; i != items.size(); i++) { 
      if (items.get(i).length() == 1) { 
       items.set(i, "0" + items.get(i)); 
      } 
     } 
     this.items = items; 
    } 

    public int getCount() { 
     return dayString.size(); 
    } 

    public Object getItem(int position) { 
     return dayString.get(position); 
    } 

    public long getItemId(int position) { 
     return 0; 
    } 

    // create a new view for each item referenced by the Adapter 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     TextView dayView; 
     if (convertView == null) { // if it's not recycled, initialize some 
      // attributes 
      LayoutInflater vi = (LayoutInflater) mContext 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.calendar_item, null); 

     } 
     dayView = (TextView) v.findViewById(R.id.date); 
     // separates daystring into parts. 
     String[] separatedTime = dayString.get(position).split("-"); 
     // taking last part of date. ie; 2 from 2012-12-02 
     String gridvalue = separatedTime[2].replaceFirst("^0*", ""); 
     // checking whether the day is in current month or not. 
     if ((Integer.parseInt(gridvalue) > 1) && (position < firstDay)) { 
      // setting offdays to white color. 
      dayView.setTextColor(Color.WHITE); 
      dayView.setClickable(false); 
      dayView.setFocusable(false); 
     } else if ((Integer.parseInt(gridvalue) < 7) && (position > 28)) { 
      dayView.setTextColor(Color.WHITE); 
      dayView.setClickable(false); 
      dayView.setFocusable(false); 
     } else { 
      // setting curent month's days in blue color. 
      dayView.setTextColor(Color.BLUE); 
     } 

     if (dayString.get(position).equals(curentDateString)) { 
      setSelected(v); 
      previousView = v; 
     } else { 
      v.setBackgroundResource(R.drawable.list_item_background); 
     } 
     dayView.setText(gridvalue); 

     // create date string for comparison 
     String date = dayString.get(position); 

     if (date.length() == 1) { 
      date = "0" + date; 
     } 
     String monthStr = "" + (month.get(GregorianCalendar.MONTH) + 1); 
     if (monthStr.length() == 1) { 
      monthStr = "0" + monthStr; 
     } 

     // show icon if date is not empty and it exists in the items array 
     ImageView iw = (ImageView) v.findViewById(R.id.date_icon); 
     if (date.length() > 0 && items != null && items.contains(date)) { 
      iw.setVisibility(View.VISIBLE); 
     } else { 
      iw.setVisibility(View.INVISIBLE); 
     } 
     Log.e("color",""+CalendarView.color); 
     if (CalendarView.color.equals("YELLOW")){ 
      v.setBackgroundColor(Color.YELLOW); 
     }else if (CalendarView.color.equals("RED")){ 
      v.setBackgroundColor(Color.RED); 
     } 

     return v; 
    } 

    public View setSelected(View view) { 
     if (previousView != null) { 
      previousView.setBackgroundResource(R.drawable.list_item_background); 
     } 
     previousView = view; 
     view.setBackgroundResource(R.drawable.calendar_cel_selectl); 
     return view; 
    } 

    public void refreshDays() { 
     // clear items 
     items.clear(); 
     dayString.clear(); 
     Locale.setDefault(Locale.US); 
     pmonth = (GregorianCalendar) month.clone(); 
     // month start day. ie; sun, mon, etc 
     firstDay = month.get(GregorianCalendar.DAY_OF_WEEK); 
     // finding number of weeks in current month. 
     maxWeeknumber = month.getActualMaximum(GregorianCalendar.WEEK_OF_MONTH); 
     // allocating maximum row number for the gridview. 
     mnthlength = maxWeeknumber * 7; 
     maxP = getMaxP(); // previous month maximum day 31,30.... 
     calMaxP = maxP - (firstDay - 1);// calendar offday starting 24,25 ... 
     /** 
     * Calendar instance for getting a complete gridview including the three 
     * month's (previous,current,next) dates. 
     */ 
     pmonthmaxset = (GregorianCalendar) pmonth.clone(); 
     /** 
     * setting the start date as previous month's required date. 
     */ 
     pmonthmaxset.set(GregorianCalendar.DAY_OF_MONTH, calMaxP + 1); 

     /** 
     * filling calendar gridview. 
     */ 
     for (int n = 0; n < mnthlength; n++) { 

      itemvalue = df.format(pmonthmaxset.getTime()); 
      pmonthmaxset.add(GregorianCalendar.DATE, 1); 
      dayString.add(itemvalue); 

     } 
    } 

    private int getMaxP() { 
     int maxP; 
     if (month.get(GregorianCalendar.MONTH) == month 
       .getActualMinimum(GregorianCalendar.MONTH)) { 
      pmonth.set((month.get(GregorianCalendar.YEAR) - 1), 
        month.getActualMaximum(GregorianCalendar.MONTH), 1); 
     } else { 
      pmonth.set(GregorianCalendar.MONTH, 
        month.get(GregorianCalendar.MONTH) - 1); 
     } 
     maxP = pmonth.getActualMaximum(GregorianCalendar.DAY_OF_MONTH); 

     return maxP; 
    } 

} 

在此先感谢

Calendar_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/calendar_cell" 
    android:gravity="center" 
    android:orientation="vertical" 
    android:padding="2dip" > 

    <TextView 
     android:id="@+id/date" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="#0000D7" 
     android:textSize="14dip" 
     android:textStyle="bold" > 
    </TextView> 

    <ImageView 
     android:id="@+id/date_icon" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/date" 
     android:src="@drawable/dot" 
     android:visibility="gone" /> 

</LinearLayout> 

回答

0

您可以设置为background color所需Grid Item根据项目的不同位置

row.setBackgroundColor(Color.GREEN); 

但由于GridView项目视图recycle,你会看到相同的背景色设置为一些其他的东西。(因为视图实例是一样的,只是数据不同)

要解决这个问题,你需要让GridView知道你有意见two different type(一个带颜色和其他无颜色)

首先OverridegetViewTypeCount,并告知GridView,你有两种数据视图

@Override 
public int getViewTypeCount() { 
    return 2; 
} 

接下来,OverridegetItemViewType并让GridView知道哪些项目的职位类型是不同的。例如,如果物品具有1 and 3事件然后return 1(一些独特的编号)为那些位置和return 0其他职位

@Override 
public int getItemViewType(int position){ 
    // return a unique number 
    if(position == 1 || position == 3){ 
     return 1; 
    } 
    else { 
     return 0; 
    } 
} 

最后,当getView被调用。检查位置,并只对那些特定项目

if(position == 1 || position == 3){ 
     row.setBackgroundColor(Color.GREEN); 
} 

这应该设置background color。完美。让我知道。

+0

谢谢回答,我已经试过您的解决方案,但还是老样子无法正常工作。 –

+0

现在是什么问题? – Libin

+0

它不会更改网格项目的颜色。 = S –

0

让你的父母充气布局的ID和设置如下图所示:

LinearLayout f_l = (LinearLayout) itemView.findViewById(R.id.pr_bg); 
     if (position % 3 == 0) { 
      f_l.setBackgroundResource(R.drawable.campaignbase_black); 
     } else if (position % 3 == 1) { 
      f_l.setBackgroundResource(R.drawable.campaignbase_pink); 
     } else if (position % 3 == 2) { 
      f_l.setBackgroundResource(R.drawable.campaignbase_brown); 
     } 
相关问题