Pregunta

Estoy tan confundido cuando mi vista de lista con un BaseAdapter se sale de la pantalla, cada fila ya no mantiene una posición consecutiva. No sé qué otra manera de explicarlo aparte de esto.

Si mi BA / LV muestra 4 elementos en la pantalla, y añadir una vista que muestra un TextView de cada fila, se muestra 0,1,2,3 para los números de fila (que es correcta). Pero tan pronto como desplazarse por la lista hasta el fondo 4 artículos (artículos 5-8) se muestra a continuación, los que como 4,5,0,1 ?? ¿¿Por qué?? Estoy tan confundido: / He tratado de hacer todo tipo de cosas (incluso algunas cosas poco convencionales, pero esta es la última cosa que tengo que no funciona).

** ** EDITAR Me descubrir que si cambio

rv = (RowView) convertView;

a

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);

que funciona, pero entonces no se vuelve a utilizar este código. Así que supongo que estoy en el camino correcto. Yo probé algunos métodos de conveniencia, pero eso no me ayudan mucho porque necesitaba para establecer estos valores antes de que el constructor disparó. ¿Es necesario crear un nuevo método y el fuego que al final? Tal como método addRow? Esto también hace que desplazarse muy lento.

          @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);

        }
¿Fue útil?

Solución

Cuando se utiliza el convertView, se le da un punto de vista que se ha utilizado previamente pero que ya no se muestra. Usted debe tener cuidado de Cancelación de todos sus atributos con el valor del elemento actual. De lo contrario, todos los valores que ha establecido en el constructor RowView se mantendrán con el valor que le dio a este punto de vista la primera vez que lo creó.

Para entender mejor listviews, usted tiene que entender que sólo se utiliza un conjunto limitado de RowViews, sólo el número que es suficiente para llenar la pantalla y unos cuantos más que se llena con sus datos justo antes de tener que mostrarlos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top