So i have a list of 7 days worth of information to display. When the list is populated the @+id/image
shows correctly (as far as i can see) and when i scroll down and back up the image is changed. In the case where the image is populated with another image it works fine, in the case of when an image is populated with a color is messes up.
I know there's probably some room for improvement here so if you have suggestions please explain them along with showing me how, thanks in advance!
public class HistoryFragment extends Fragment{
ListView listTimeline;
SimpleCursorAdapter adapter;
String is_period = "", is_test = "", is_headache = "", is_energy = "", is_mood = "", is_stamp = "", is_intercorse = "", is_fertile= "", is_cervix="", is_temp = "";
IntentFilter filter;
static final String[] FROM = { StatusData.KEY_CHARTING_DATE, StatusData.KEY_CHARTING_NOTES, StatusData.KEY_CHARTING_FERTILE,
StatusData.KEY_CHARTING_TEMPERATURE, StatusData.KEY_CHARTING_PERIOD, StatusData.KEY_CHARTING_INTERCORSE,
StatusData.KEY_CHARTING_MOOD, StatusData.KEY_CHARTING_HEADACHE, StatusData.KEY_CHARTING_TEST,
StatusData.KEY_CHARTING_ENERGY, StatusData.KEY_CHARTING_STAMPS, StatusData.KEY_CHARTING_CERVIX };
static final int[] TO = { R.id.txtCreatedAt, R.id.txtNote, R.id.txtFertile,
R.id.txtTemp, R.id.imgPeriod, R.id.imgIntercorse,
R.id.imgMood, R.id.imgHeadache, R.id.imgPregancy,
R.id.imgEnergy, R.id.image, R.id.txtCervix};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_history, container, false);
listTimeline = (ListView) view.findViewById(R.id.listTimeline);
setupList();
return view;
}
private void setupList() {
// Get the data
Cursor c = getActivity().getContentResolver().query(StatusProvider.CONTENT_URI_CHARTING, null, null , null, StatusData.KEY_CHARTING_DATE + " DESC" + " LIMIT 7"); // <3>
// create the adapter using the cursor pointing to the desired data
//as well as the layout information
adapter = new SimpleCursorAdapter(getActivity(), R.layout.history_row, c, FROM, TO, 0){
@Override
public boolean isEnabled(int position) {
return false;
}
};
adapter.setViewBinder(new CustomViewBinder());
// Assign adapter to ListView
listTimeline.setAdapter(adapter);
}
private class CustomViewBinder implements ViewBinder {
private Date parseDate(String date) {
SimpleDateFormat curFormater = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
Date dateObj = new Date();
try {
dateObj = curFormater.parse(date);
} catch (java.text.ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return dateObj;
}
@Override
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
if (columnIndex == cursor.getColumnIndex(StatusData.KEY_CHARTING_DATE)) {
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy", Locale.US);
String date = cursor.getString(columnIndex);
Date dateObj = parseDate(date);
String formatedDate = format.format(dateObj);
TextView tv = (TextView) view;
tv.setText(formatedDate);
return true;
}
if (columnIndex == cursor.getColumnIndex(StatusData.KEY_CHARTING_PERIOD)) {
// If the column is IS_STAR then we use custom view.
is_period = cursor.getString(columnIndex);
if (is_period != null) {
if (is_period.equalsIgnoreCase("no")){
// set the visibility of the view to GONE
view.setVisibility(View.INVISIBLE);
} else {
view.getLayoutParams().height = 40;
view.getLayoutParams().width = 40;
view.setVisibility(View.VISIBLE);
}
} else {
view.setVisibility(View.INVISIBLE);
}
return true;
}
if (columnIndex == cursor.getColumnIndex(StatusData.KEY_CHARTING_INTERCORSE)) {
// If the column is IS_STAR then we use custom view.
is_intercorse = cursor.getString(columnIndex);
if (is_intercorse != null) {
if (is_intercorse.equalsIgnoreCase("no")) {
// set the visibility of the view to GONE
view.setVisibility(View.INVISIBLE);
} else {
view.getLayoutParams().height = 40;
view.getLayoutParams().width = 40;
view.setVisibility(View.VISIBLE);
}
} else {
view.setVisibility(View.INVISIBLE);
}
return true;
}
if (columnIndex == cursor.getColumnIndex(StatusData.KEY_CHARTING_ENERGY)) {
// If the column is IS_STAR then we use custom view.
is_energy = cursor.getString(columnIndex);
if (is_energy != null) {
if (is_energy.equalsIgnoreCase("no") ) {
// set the visibility of the view to GONE
view.setVisibility(View.INVISIBLE);
} else {
Drawable is_energy_draw = getResources().getDrawable(getResources().getIdentifier("drawable/" + is_energy, null, getActivity().getPackageName()));
view.setBackground(is_energy_draw);
view.getLayoutParams().height = 40;
view.getLayoutParams().width = 40;
view.setVisibility(View.VISIBLE);
}
} else {
view.setVisibility(View.INVISIBLE);
}
return true;
}
if (columnIndex == cursor.getColumnIndex(StatusData.KEY_CHARTING_HEADACHE)) {
// If the column is IS_STAR then we use custom view.
is_headache = cursor.getString(columnIndex);
if (is_headache != null) {
if (is_headache.equalsIgnoreCase("no")) {
// set the visibility of the view to GONE
view.setVisibility(View.INVISIBLE);
} else {
view.getLayoutParams().height = 40;
view.getLayoutParams().width = 40;
view.setVisibility(View.VISIBLE);
}
} else {
view.setVisibility(View.INVISIBLE);
}
return true;
}
if (columnIndex == cursor.getColumnIndex(StatusData.KEY_CHARTING_TEST)) {
// If the column is IS_STAR then we use custom view.
is_test = cursor.getString(columnIndex);
if (is_test != null) {
if (is_test.equalsIgnoreCase("no")) {
// set the visibility of the view to GONE
view.setVisibility(View.INVISIBLE);
} else {
view.getLayoutParams().height = 40;
view.getLayoutParams().width = 40;
view.setVisibility(View.VISIBLE);
}
} else {
view.setVisibility(View.INVISIBLE);
}
return true;
}
if (columnIndex == cursor.getColumnIndex(StatusData.KEY_CHARTING_MOOD)) {
// If the column is IS_STAR then we use custom view.
is_mood = cursor.getString(columnIndex);
if (is_mood != null) {
if (is_mood.equalsIgnoreCase("no")) {
// set the visibility of the view to GONE
view.setVisibility(View.INVISIBLE);
} else {
Drawable is_mood_draw = getResources().getDrawable(getResources().getIdentifier("drawable/" + is_mood, null, getActivity().getPackageName()));
view.setBackground(is_mood_draw);
view.getLayoutParams().height = 40;
view.getLayoutParams().width = 40;
view.setVisibility(View.VISIBLE);
}
} else {
view.setVisibility(View.INVISIBLE);
}
return true;
}
if (columnIndex == cursor.getColumnIndex(StatusData.KEY_CHARTING_FERTILE)) {
// If the column is IS_STAR then we use custom view.
is_fertile = cursor.getString(columnIndex);
if (is_fertile != null) {
((TextView) view).setText(is_fertile);
} else {
((TextView) view).setText("No");
view.setVisibility(View.INVISIBLE);
}
return true;
}
if (columnIndex == cursor.getColumnIndex(StatusData.KEY_CHARTING_CERVIX)) {
// If the column is IS_STAR then we use custom view.
is_cervix = cursor.getString(columnIndex);
if (is_cervix != null) {
((TextView) view).setText(is_cervix);
} else {
((TextView) view).setText("No");
view.setVisibility(View.INVISIBLE);
}
return true;
}
if (columnIndex == cursor.getColumnIndex(StatusData.KEY_CHARTING_TEMPERATURE)) {
// If the column is IS_STAR then we use custom view.
is_temp = cursor.getString(columnIndex);
if (is_temp != null) {
((TextView) view).setText(is_temp);
} else {
((TextView) view).setText("No");
view.setVisibility(View.INVISIBLE);
}
return true;
}
if (columnIndex == cursor.getColumnIndex(StatusData.KEY_CHARTING_STAMPS)) {
is_stamp = cursor.getString(columnIndex);
if (is_stamp != null) {
if (is_stamp.equalsIgnoreCase("no")) {
// set the visibility of the view to GONE
if (!is_fertile.equalsIgnoreCase("no") && !is_fertile.equalsIgnoreCase("")) {
view.setBackgroundColor(Color.YELLOW);
} else if(!is_cervix.equalsIgnoreCase("no") && !is_cervix.equalsIgnoreCase("0") && !is_cervix.equalsIgnoreCase("")) {
view.setBackgroundColor(Color.BLACK);
} else if(!is_temp.equalsIgnoreCase("no") && !is_temp.equalsIgnoreCase("0") && !is_temp.equalsIgnoreCase("")) {
view.setBackgroundColor(Color.WHITE);
} else if(!is_period.equalsIgnoreCase("no") && !is_period.equalsIgnoreCase("")) {
view.setBackgroundColor(Color.RED);
}
view.setVisibility(View.VISIBLE);
} else {
Drawable is_stamp_draw = getResources().getDrawable(getResources().getIdentifier("drawable/" + is_stamp, null, getActivity().getPackageName()));
view.setBackground(is_stamp_draw);
view.getLayoutParams().height = 211;
view.getLayoutParams().width = 120;
view.setVisibility(View.VISIBLE);
}
} else {
view.setVisibility(View.VISIBLE);
}
}
// For others, we simply return false so that the default binding
// happens.
return false;
}
}
}
list xml:
<!-- <1> -->
<ListView
android:layout_height="match_parent"
android:layout_width="match_parent"
android:id="@+id/listTimeline" />
</LinearLayout>
row xml:
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<ImageView
android:id="@+id/image"
android:layout_width="120px"
android:layout_height="211px"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" />
<TextView
android:id="@+id/lblFertile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/txtCreatedAt"
android:layout_below="@+id/txtCreatedAt"
android:text="@string/lblFertile"
android:textStyle="bold" />
<TextView
android:id="@+id/txtCervix"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/lblCervix"
android:layout_alignBottom="@+id/lblCervix"
android:layout_toRightOf="@+id/lblCervix"
android:paddingLeft="5sp"
android:text="@string/NA" />
<TextView
android:id="@+id/txtFertile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/lblFertile"
android:layout_alignBottom="@+id/lblFertile"
android:layout_toRightOf="@+id/lblFertile"
android:paddingLeft="5sp"
android:text="@string/NA" />
<TextView
android:id="@+id/txtCreatedAt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="24dp"
android:layout_toRightOf="@+id/image"
android:gravity="left"
android:text="@string/defDate" />
<TextView
android:id="@+id/lblCervix"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/txtFertile"
android:layout_marginLeft="24dp"
android:layout_toRightOf="@+id/txtCreatedAt"
android:text="@string/lblCervix"
android:textStyle="bold" />
<TextView
android:id="@+id/lblNotes"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/lblTemp"
android:layout_below="@+id/lblTemp"
android:text="@string/lblNotes"
android:textStyle="bold" />
<TextView
android:id="@+id/txtNote"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/lblNotes"
android:layout_below="@+id/lblNotes"
android:text="@string/NA" />
<TextView
android:id="@+id/lblTemp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/lblFertile"
android:layout_below="@+id/lblFertile"
android:text="@string/lblTemp"
android:textStyle="bold" />
<TextView
android:id="@+id/txtTemp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/lblNotes"
android:layout_alignLeft="@+id/txtFertile"
android:paddingLeft="5sp"
android:text="@string/NA" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/lblFertile"
android:layout_alignBottom="@+id/image"
android:layout_toRightOf="@+id/image" >
<ImageView
android:id="@+id/imgIntercorse"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="10dp"
android:src="@drawable/intercorse" />
<ImageView
android:id="@+id/imgPregancy"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="10dp"
android:src="@drawable/pregnancy" />
<ImageView
android:id="@+id/imgPeriod"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="10dp"
android:src="@drawable/period" />
<ImageView
android:id="@+id/imgHeadache"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="10dp"
android:src="@drawable/headache" />
<ImageView
android:id="@+id/imgMood"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="10dp" />
<ImageView
android:id="@+id/imgEnergy"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="10dp"
android:background="@drawable/energy_1" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
I ended up fixing it by stop using setBackground color and using a image instead.