Pergunta

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>
Foi útil?

Solução

I ended up fixing it by stop using setBackground color and using a image instead.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top