Frage

Ich bin so verwirrt, wenn meine Listenansicht einer BaseAdapter mit dem Bildschirm erlischt, jede Zeile nicht länger unterhält eine fortlaufende Position. Ich weiß nicht, wie ich es anders als andere, dies zu erklären.

Wenn mein BA / LV zeigt 4 Elemente auf dem Bildschirm, und ich füge hinzu eine Ansicht, die eine Textview jeder Zeile zeigt, zeigt es 0,1,2,3 für die Zeilennummern (was richtig ist). Aber sobald ich die Liste nach unten scrollen, um die unteren 4 Artikel (Artikel 5-8) dann zeigt diese als 4,5,0,1 ?? Warum?? Ich bin so verwirrt: / Ich habe versucht, alle möglichen Dinge zu tun (auch einige unkonventionelle Dinge, aber das ist das letzte, was ich habe, dass nicht funktioniert).

** EDIT ** Ich habe feststellen, dass, wenn ich ändern

rv = (RowView) convertView;

rv =  new RowView(mContext,(cursor.getString(2)),
                        (cursor.getString(5)),
                        cursor.getString(cursor.getColumnIndex(DBHelper.KEY_IMAGEFILENAME)),
                        cursor.getString(cursor.getColumnIndex(DBHelper.KEY_CITY)),position);

, dass es funktioniert, aber dann ist es nicht erneut mit dem Code. Also ich denke, ich auf dem richtigen Weg bin. Ich habe einige bequemen Methoden versuchen, aber das half mir nicht zu viel, weil ich diese Werte setzen benötigt, bevor der Konstruktor feuerte. Muß ich eine neue Methode schaffen, und dass am Ende Feuer? Wie addRow Methode? Dies bewirkt auch, dass es sehr langsam bewegen.

          @Override
               public void onCreate(Bundle bundle)
               {
                 super.onCreate(bundle);
                 //setContentView(R.layout.findlist);
                 //getListView().setEmptyView(findViewById(R.id.empty));
                 mDbHelper = new DBHelper(this);
                 mDbHelper.open();
                 cursor = mDbHelper.fetchAllLocations();
                 startManagingCursor(cursor);
                 mAdapter = new myListAdapter(this);
                 setListAdapter(mAdapter);

               }
    public class myListAdapter extends BaseAdapter {
            public String testing;
            public myListAdapter(Context c) {
                mContext = c;
                // TODO Auto-generated constructor stub
            }

            @Override
            public int getCount() {
                // TODO Auto-generated method stub
                return cursor.getCount();
            }

            @Override
            public Object getItem(int position) {
                // TODO Auto-generated method stub
                return position;
            }

            @Override
            public long getItemId(int position) {
                // TODO Auto-generated method stub
                return position;
            }

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {


                 cursor.moveToPosition(position);
                 RowView rv;


                 if (convertView == null) {
                        rv = new RowView(mContext,(cursor.getString(2)),
                                (cursor.getString(5)),
                                cursor.getString(cursor.getColumnIndex(DBHelper.KEY_IMAGEFILENAME)),
                                cursor.getString(cursor.getColumnIndex(DBHelper.KEY_CITY)),position);
                    } else {
                        rv = (RowView) convertView;
                        try {
              // I KNOW THIS SECTION IS NOT RIGHT, BUT I HAVE BEEN MESSING IN HERE          
                        rv.setAddress(cursor.getString(2));
                        rv.setCity(cursor.getString(5));
                        rv.setFocusable(true);
                        rv.setClickable(true); }
                        catch (Exception e) {
                            rv = (RowView) convertView;
                            rv.setAddress(cursor.getString(2));
                            rv.setCity(cursor.getString(5));
                            rv.setFocusable(true);
                            rv.setClickable(true); 
                            Toast mToast;
                            mToast = Toast.makeText(FindList.this, "Error :" + e.toString() ,
                                    Toast.LENGTH_LONG);
                            mToast.show();
                        }
                    }

                 return rv;
            }

            public void addItems() {

                 //String[] from = new String[] { DBHelper.KEY_BUSINESSNAME, DBHelper.KEY_ADDRESS, DBHelper.KEY_CITY, DBHelper.KEY_GPSLONG, DBHelper.KEY_GPSLAT,  DBHelper.KEY_IMAGEFILENAME  + ""};
                 // create array of values of widgits
                 //to = new int[] { R.id.businessname, R.id.address, R.id.city, R.id.gpslong, R.id.gpslat, R.id.preview};
                 // Now create an array adapter and set it to display using our row from notes_row.xml


            }



        }


private class RowView extends LinearLayout {
        private TextView mAddress;
        private TextView mCity;
        public ImageView mArrow;
        public ImageView mPicture;
        public String mPathName;
        public String mDateTime;
        public RowView(Context context, String title, String words, String pathName, String city, int position) {
            super(context);

            this.setOrientation(HORIZONTAL);
            this.setVerticalGravity(16); //CENTER_VERTICAL 

            // Here we build the child views in code. They could also have
            // been specified in an XML file.

            //DISPLAY DELETE BUTTON
            Button mButton = new Button(context);
            mButton.setFocusable(false);
            mButton.setId(position);
            mButton.setBackgroundResource(R.drawable.delete3);
            addView(mButton, new LinearLayout.LayoutParams(
                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

            TextView mTitle;
            mTitle = new TextView(context);
            mTitle.setText(Integer.toString(position));
            addView(mTitle, new LinearLayout.LayoutParams(
                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

            this.setOrientation(HORIZONTAL);      

            try {
             Bitmap bm = Bitmap.createScaledBitmap(BitmapFactory.decodeFile(cursor.getString(cursor.getColumnIndex(DBHelper.KEY_IMAGEFILENAME))),100, 100, true);
                mPicture = new ImageView(context);
                mPicture.setImageBitmap(bm);    
           } catch (Exception e) { 
                 mPicture = new ImageView(context);
                 mPicture.setImageResource(R.drawable.noimage);
           }     

            addView(mPicture, new LinearLayout.LayoutParams(
                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

            mArrow = new ImageView(context);
            mArrow.setBackgroundResource(R.drawable.arrowleft3);
            addView(mArrow, new LinearLayout.LayoutParams(
                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

            currentPosition = position;
            Button button = (Button)findViewById(position);
            button.setOnClickListener(mCorkyListener);

        }
War es hilfreich?

Lösung

Wenn die convertView verwenden, werden Sie eine Ansicht gegeben, die zuvor verwendet wurde, aber die angezeigt wird, nicht mehr. Sie sollten mit dem Wert des aktuellen Elements kümmern uns seine Attribute ALL zurückzusetzen. Ansonsten werden alle Werte, die Sie im RowView Konstruktor festgelegt haben, wird das erste Mal mit dem Wert, den Sie zu dieser Ansicht gab gehalten werden Sie es erstellt haben.

Um besser zu verstehen Listviews, Sie müssen verstehen, dass es nur eine begrenzte Anzahl an RowViews verwendet, sondern nur die Zahl, das genug ist, um die Anzeige zu füllen und ein paar mehr, die nur mit Ihren Daten gefüllt werden, bevor er sie angezeigt werden soll.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top