Adaptador personalizado de calendario y calendario

Tengo un calendario personalizado, modificado del que se ve aquí . En carga inicial muestra todo lo que se supone.

Sin embargo tengo dos problemas.

1.) En el botón del mes anterior va de agosto a julio como se esperaba pero no borra todas las imágenes.

2.) De julio a agosto se mantiene en julio y reorganiza las fechas.

BaseAdapter:

public class CalendarAdapter extends BaseAdapter { private Context mContext; private java.util.Calendar month; public GregorianCalendar pmonth; // calendar instance for previous month public GregorianCalendar pmonthmaxset; private GregorianCalendar selectedDate; public static List<String> dayString; private List<String[]> anArrayOfStrings = new ArrayList<String[]>(); int firstDay, maxWeeknumber, maxP, calMaxP, lastWeekDay, leftDays, mnthlength; String itemvalue, curentDateString; DateFormat df; ImageView mimgPeriod, mimgEnergy, mimgIntercorse, mimgPregancy, mimgHeadache, mimgMood; DateFormat formatter; Date rowdatetemp; Date caldatetemp; String box; private int mHeight = 0; private int mWidth = 0; 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); new ArrayList<String>(); df = new SimpleDateFormat("yyyy-MM-dd", Locale.US); curentDateString = df.format(selectedDate.getTime()); refreshDays(); box = null; } public void setItems(List<String[]> anArrayOfStrings) { this.anArrayOfStrings = anArrayOfStrings; } 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 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); } 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; } //look in the hashtable in order to find the position date and then populate the img's if ((anArrayOfStrings != null) && (anArrayOfStrings.size() > 0)) { if (formatter == null) { formatter = new SimpleDateFormat("yyyy-MM-dd", Locale.US); } Log.i("PROJECTCARUSO","Date: " + date); for (String[] row : anArrayOfStrings) { //convert date's try { caldatetemp = (Date)formatter.parse(date); } catch (ParseException e) { e.printStackTrace(); } try { rowdatetemp = (Date)formatter.parse(row[0]); } catch (ParseException e) { e.printStackTrace(); } // current position date in calendar // array date is after the calendar date if (rowdatetemp.after(caldatetemp)) { break; //current position date > first array date then continue to see if there is one for this date } else if (rowdatetemp.before(caldatetemp)) { continue; //Found a match } else if (date.equalsIgnoreCase(row[0])) { for (int i = 1; i < row.length; i++) { Log.i("PROJECTCARUSO","row[" + i +"]: " + row[i]); //Now that we have a match look through each detail if ( row[i]!= null ) { if ((i == 1) && ((row[i].equalsIgnoreCase("yes")) || (isNumeric(row[i])))) { mimgPeriod = (ImageView) v.findViewById(R.id.imgPeriod); setVisible(v, mimgPeriod); mimgPeriod.setImageAlpha(100); box = "red"; continue; } if ((i == 2) && ((row[i].equalsIgnoreCase("yes")) || (isNumeric(row[i])))) { mimgIntercorse = (ImageView) v.findViewById(R.id.imgIntercorse); setVisible(v, mimgIntercorse); mimgIntercorse.setImageAlpha(100); continue; } if ((i == 4) && ((row[i].equalsIgnoreCase("yes")) || (isNumeric(row[i])))) { mimgHeadache = (ImageView) v.findViewById(R.id.imgHeadache); setVisible(v, mimgHeadache); mimgHeadache.setImageAlpha(100); continue; } if ((i == 5) && ((row[i].equalsIgnoreCase("yes")) || (isNumeric(row[i])))) { mimgPregancy = (ImageView) v.findViewById(R.id.imgPregancy); setVisible(v, mimgPregancy); mimgPregancy.setImageAlpha(100); continue; } } if (( row[i]!= null ) && (i == 6) && (!row[i].equalsIgnoreCase("no"))) { mimgEnergy = (ImageView) v.findViewById(R.id.imgEnergy); setImg(v, mimgEnergy, row[i].toString()); setVisible(v, mimgEnergy); continue; } if (( row[i]!= null ) && (i == 3) && (!row[i].equalsIgnoreCase("no"))) { mimgMood = (ImageView) v.findViewById(R.id.imgMood); setImg(v, mimgMood, row[i].toString()); setVisible(v, mimgMood); continue; } if (( row[i]!= null ) && (i == 7) || (box != null)) { if (box == null) { if (row[i].equalsIgnoreCase("no")) { box = "brown"; } else { box = "yellow"; } } Drawable []layers = new Drawable [2]; int imageResource1 = mContext.getResources().getIdentifier("drawable/calendar_cell", null, mContext.getPackageName()); Drawable background = v.getResources().getDrawable(imageResource1); layers [0]= background; int imageResource = mContext.getResources().getIdentifier("drawable/box_" + box, null, mContext.getPackageName()); Drawable boxImg = v.getResources().getDrawable(imageResource); boxImg.setAlpha(100); layers [1]= boxImg; LayerDrawable layerDrawable = new LayerDrawable (layers); mWidth = v.getWidth(); mHeight=v.getHeight(); v.getLayoutParams().height = mHeight; v.getLayoutParams().width = mWidth; v.setBackground(layerDrawable); //reset box = null; continue; } } } else { break; } } } else { Log.i("PROJECTCARUSO","RESETING VIEWS TO INVISIBLE"); mimgMood = (ImageView) v.findViewById(R.id.imgMood); mimgEnergy = (ImageView) v.findViewById(R.id.imgEnergy); mimgPregancy = (ImageView) v.findViewById(R.id.imgPregancy); mimgHeadache = (ImageView) v.findViewById(R.id.imgHeadache); mimgIntercorse = (ImageView) v.findViewById(R.id.imgIntercorse); mimgPeriod = (ImageView) v.findViewById(R.id.imgPeriod); setInvisibleVisible(v, mimgMood); setInvisibleVisible(v, mimgEnergy); setInvisibleVisible(v, mimgPregancy); setInvisibleVisible(v, mimgHeadache); setInvisibleVisible(v, mimgIntercorse); setInvisibleVisible(v, mimgPeriod); } //clear the array after using it. //anArrayOfStrings.clear(); return v; } public View setVisible(View view, ImageView iv) { iv.setVisibility(View.VISIBLE); return view; } public View setInvisibleVisible(View view, ImageView iv) { iv.setVisibility(View.INVISIBLE); return view; } public View setImg(View view, ImageView iv, String mood) { iv.setImageAlpha(100); iv.setVisibility(View.VISIBLE); int draw = mContext.getResources().getIdentifier("drawable/" + mood, null, mContext.getPackageName()); iv.setImageResource(draw); return view; } public void refreshDays() { // clear items anArrayOfStrings.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 ... pmonthmaxset = (GregorianCalendar) pmonth.clone(); pmonthmaxset.set(GregorianCalendar.DAY_OF_MONTH, calMaxP + 1); 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; } @SuppressWarnings("unused") public static boolean isNumeric(String str) { try { double d = Double.parseDouble(str); } catch(NumberFormatException nfe) { return false; } return true; } } 

Calendario:

 public class CalendarFragment extends Fragment { public GregorianCalendar month;// calendar instances. public CalendarAdapter adapter; // adapter instance public Handler handler; // for grabbing some event values for showing the dot // marker. public ArrayList<String> items; // container to store calendar items which // needs showing the event marker int i; List<String[]> anArrayOfStrings = new ArrayList<String[]>(); String startdate, enddate; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_calendar, null); month = (GregorianCalendar) GregorianCalendar.getInstance(); month.set(Calendar.DAY_OF_MONTH, 1-1); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd",Locale.US); //start date for cursor startdate = df.format(month.getTime()); //end date month.add(Calendar.MONTH, 1); month.add(Calendar.DAY_OF_MONTH, +5); enddate = df.format(month.getTime()); month.add(Calendar.MONTH, -1); Locale.setDefault( Locale.US ); month = (GregorianCalendar) GregorianCalendar.getInstance(); items = new ArrayList<String>(); adapter = new CalendarAdapter(getActivity(), month); GridView gridview = (GridView) view.findViewById(R.id.gridview); gridview.setAdapter(adapter); handler = new Handler(); handler.post(calendarUpdater); TextView title = (TextView) view.findViewById(R.id.title); title.setText(android.text.format.DateFormat.format("MMMM yyyy", month)); RelativeLayout previous = (RelativeLayout) view.findViewById(R.id.previous); previous.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { setPreviousMonth(); refreshCalendar(); } }); RelativeLayout next = (RelativeLayout) view.findViewById(R.id.next); next.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { setNextMonth(); refreshCalendar(); } }); gridview.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { String selectedGridDate = CalendarAdapter.dayString .get(position); String[] separatedTime = selectedGridDate.split("-"); String gridvalueString = separatedTime[2].replaceFirst("^0*", "");// taking last part of date. ie; 2 from 2012-12-02. int gridvalue = Integer.parseInt(gridvalueString); // navigate to next or previous month on clicking offdays. if ((gridvalue > 10) && (position < 8)) { setPreviousMonth(); refreshCalendar(); } else if ((gridvalue < 7) && (position > 28)) { setNextMonth(); refreshCalendar(); } } }); return view; } protected void setNextMonth() { if (month.get(GregorianCalendar.MONTH) == month .getActualMaximum(GregorianCalendar.MONTH)) { month.set((month.get(GregorianCalendar.YEAR) + 1), month.getActualMinimum(GregorianCalendar.MONTH), 1); } else { month.set(GregorianCalendar.MONTH, month.get(GregorianCalendar.MONTH) + 1); } } protected void setPreviousMonth() { if (month.get(GregorianCalendar.MONTH) == month .getActualMinimum(GregorianCalendar.MONTH)) { month.set((month.get(GregorianCalendar.YEAR) - 1), month.getActualMaximum(GregorianCalendar.MONTH), 1); } else { month.set(GregorianCalendar.MONTH, month.get(GregorianCalendar.MONTH) - 1); } } public void refreshCalendar() { TextView title = (TextView) getActivity().findViewById(R.id.title); adapter.refreshDays(); adapter.notifyDataSetChanged(); handler.post(calendarUpdater); // generate some calendar items title.setText(android.text.format.DateFormat.format("MMMM yyyy", month)); } public Runnable calendarUpdater = new Runnable() { @Override public void run() { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd",Locale.US); //start date for cursor month.add(Calendar.DAY_OF_MONTH, -1); startdate = df.format(month.getTime()); //end date month.add(Calendar.MONTH, 1); enddate = df.format(month.getTime()); month.add(Calendar.MONTH, -1); anArrayOfStrings.clear(); // Get the data Cursor c = getActivity().getContentResolver().query(StatusProvider.CONTENT_URI_CHARTING, null, "? < " + StatusData.KEY_CHARTING_DATE + " AND ? > " + StatusData.KEY_CHARTING_DATE , new String[] {startdate, enddate}, StatusData.KEY_CHARTING_DATE + " ASC"); c.moveToFirst(); while(c.isAfterLast() == false){ anArrayOfStrings.add( new String [] {c.getString(c.getColumnIndex(StatusData.KEY_CHARTING_DATE)), c.getString(c.getColumnIndex(StatusData.KEY_CHARTING_PERIOD)), c.getString(c.getColumnIndex(StatusData.KEY_CHARTING_INTERCORSE)), c.getString(c.getColumnIndex(StatusData.KEY_CHARTING_MOOD)), c.getString(c.getColumnIndex(StatusData.KEY_CHARTING_HEADACHE)), c.getString(c.getColumnIndex(StatusData.KEY_CHARTING_TEST)), c.getString(c.getColumnIndex(StatusData.KEY_CHARTING_ENERGY)), c.getString(c.getColumnIndex(StatusData.KEY_CHARTING_FERTILE) )}); Log.i("PROJECTCARUSO","DATE ADDED TO ARRAY:" + c.getString(c.getColumnIndex(StatusData.KEY_CHARTING_DATE))); i+=1; c.moveToNext(); } adapter.setItems(anArrayOfStrings); adapter.notifyDataSetChanged(); } }; } 

Calendar_item.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/item" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/calendar_cell" android:orientation="vertical" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/date" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="1" android:textColor="#0000D7" android:textSize="14sp" android:textStyle="bold" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <ImageView android:id="@+id/imgPeriod" android:layout_width="15dp" android:layout_height="15dp" android:src="@drawable/period" android:visibility="invisible"/> <ImageView android:id="@+id/imgIntercorse" android:layout_width="15dp" android:layout_height="15dp" android:src="@drawable/intercorse" android:visibility="invisible" /> <ImageView android:id="@+id/imgPregancy" android:layout_width="15dp" android:layout_height="15dp" android:src="@drawable/pregnancy" android:visibility="invisible" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <ImageView android:id="@+id/imgEnergy" android:layout_width="15dp" android:layout_height="15dp" android:src="@drawable/energy_1" android:visibility="invisible" /> <ImageView android:id="@+id/imgHeadache" android:layout_width="15dp" android:layout_height="15dp" android:src="@drawable/pregnancy" android:visibility="invisible" /> <ImageView android:id="@+id/imgMood" android:layout_width="15dp" android:layout_height="15dp" android:src="@drawable/mood" android:visibility="invisible" /> </LinearLayout> </LinearLayout> 

Fragment_calendar.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/background" android:orientation="vertical" > <RelativeLayout android:id="@+id/header" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/calendar_top" > <RelativeLayout android:id="@+id/previous" android:layout_width="40dip" android:layout_height="30dip" android:layout_alignParentLeft="true" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:background="@drawable/arrow_left" /> </RelativeLayout> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginTop="5dip" android:textColor="#000000" android:textSize="18dip" android:textStyle="bold" /> <RelativeLayout android:id="@+id/next" android:layout_width="40dip" android:layout_height="30dip" android:layout_alignParentRight="true" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:background="@drawable/arrow_right" /> </RelativeLayout> </RelativeLayout> <GridView android:id="@+id/gridview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:listSelector="@android:color/transparent" android:numColumns="7" android:stretchMode="columnWidth" /> </LinearLayout> 

One Solution collect form web for “Adaptador personalizado de calendario y calendario”

1era corrección: No estoy restableciendo el fondo. Así que esto arregla esa parte. Ahora las vistas (fechas) no están recibiendo repopulated cuando ir mes anterior.

 //set background int imageResource = mContext.getResources().getIdentifier("drawable/calendar_cell", null, mContext.getPackageName()); Drawable orgImg = v.getResources().getDrawable(imageResource); v.setBackground(orgImg); 

2ª corrección: La reutilización del objeto de calendario es desechar su calendario. Cree un nuevo objeto de calendario para que no entren en conflicto entre sí.

  • OverridePendingTransition en el adaptador gridview
  • ¿Cómo elimino un elemento de mi adaptador de base personalizado?
  • Universal Image Loader recarga la imagen después de cada desplazamiento
  • ¿Qué adaptador usar - BaseAdapter o ArrayAdapter?
  • MultiAutoCompleteTextView con adaptador personalizado muestra una cadena de caracteres dañada
  • Cómo obtener el contexto de BaseAdapter en Android
  • NotifyDataSetChange no funciona desde un adaptador personalizado
  • Agregar el botón favorito en la vista de lista
  • ListView muestra sólo un elemento
  • BaseAdapter.notifyDatasetChanged () no actualizar el ListView
  • Evitar que el adaptador recicle las vistas en desplazamiento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.