Autore Topic: ListView, custom Adapter e Cursor  (Letto 836 volte)

Offline daimadoshi85

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S 2
  • Play Store ID:
    Luca Bonora
  • Sistema operativo:
    Ubuntu
ListView, custom Adapter e Cursor
« il: 22 Luglio 2010, 13:36:56 CEST »
+1
Salve a tutti, sono nuovo di questo forum (prima ero utente di anddev.org) e  ho un problema con la listView che sto facendo:
praticamente ho creato una custom listView che prenda un listAdapter esteso da me per visualizzare una imageView solo quando è presente nel database, il problema è che riesco a visualizzare solo la prima riga e basta, e non capisco se è questione del cursore oppure è perchè da qualche parte (e non so dove) dovrei dire di andare alla posizione successiva del cursore, potete aiutarmi?
Questo è il codice per la popolazione della listView
Codice (Java): [Seleziona]
// Create the item list
                startManagingCursor(list);

                String[] from = new String[] { ListDbAdapter.KEY_NAME};
                int[] to = new int[] { R.id.text1};

                // Now create an array adapter and set it to display using our row
                EfficientAdapter listAdapter = new EfficientAdapter(this,
                                R.layout.manga_row, list, from, to);
                setListAdapter(listAdapter);

e questo è il custom adapter:
Codice (Java): [Seleziona]
private static class EfficientAdapter extends SimpleCursorAdapter {
                private LayoutInflater mInflater;
                private int layout;
                private Bitmap mIcon1;
                private String[] from;
                private Context context;
                private int[] to;
                       
                public EfficientAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
                        super(context, layout, c, from, to);
                        // Cache the LayoutInflate to avoid asking for a new one each time.
                        this.context=context;
                    this.layout=layout;
                    this.from=from;
                    this.to=to;
                    // Icons bound to the rows.
                    mIcon1 = BitmapFactory.decodeResource(context.getResources(), android.R.drawable.star_big_on);
                }
                        @Override
                        public int getCount() {
                                return this.from.length;
                        }
                        @Override
                        public Object getItem(int position) {
                                return this.to[position];
                        }
                        @Override
                        public long getItemId(int position) {
                                return position;
                        }
                        @Override
                        public View getView(int position, View convertView, ViewGroup parent) {
                                // A ViewHolder keeps references to children views to avoid unneccessary calls
                    // to findViewById() on each row.
                    ViewHolder holder;
                 // When convertView is not null, we can reuse it directly, there is no need
                    // to reinflate it. We only inflate a new View when the convertView supplied
                    // by ListView is null.
                    if (convertView == null) {
                        mInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                        convertView = mInflater.inflate(layout, null);

                        // Creates a ViewHolder and store references to the two children views
                        // we want to bind data to.
                        holder = new ViewHolder();
                        holder.name = (TextView) convertView.findViewById(R.id.text1);
                        holder.number = (TextView) convertView.findViewById(R.id.text2);
                        holder.icon = (ImageView) convertView.findViewById(R.id.tick);

                        convertView.setTag(holder);
                    } else {
                        // Get the ViewHolder back to get fast access to the TextView
                        // and the ImageView.
                        holder = (ViewHolder) convertView.getTag();
                    }
                   
                    Cursor cursor = getCursor();
                    // Bind the data efficiently with the holder.
                    cursor.moveToPosition(position);

                    String name = cursor.getString(cursor.getColumnIndex(ListDbAdapter.KEY_NAME));
                    String number = cursor.getString(cursor.getColumnIndex(ListDbAdapter.KEY_NUMBER));
                    int presence = cursor.getInt(cursor.getColumnIndex(ListDbAdapter.KEY_PRESENCE));
                    holder.name.setText(name);
                    holder.number.setText(number);
                    if (presence != 0) holder.icon.setImageBitmap(mIcon1);
                   
                    return convertView;
                }

                static class ViewHolder {
                    TextView name;
                    TextView number;
                    ImageView icon;
                }
        }

Potete darmi una mano? Cosa sbaglio?
Grazie a tutti per l'aiuto.
« Ultima modifica: 22 Luglio 2010, 14:05:47 CEST da Qlimax »

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:ListView, custom Adapter e Cursor
« Risposta #1 il: 22 Luglio 2010, 13:57:26 CEST »
0
Guardando velocemente ho notato che la funzione getCount restituisce this.from.length.
Ma from è definito come new String[] { ListDbAdapter.KEY_NAME}
Il che significa che la getCount restituisce sempre e comunque 1... dovresti far restituire la lunghezza della lista (quindi del cursore).

Prova...

Offline daimadoshi85

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S 2
  • Play Store ID:
    Luca Bonora
  • Sistema operativo:
    Ubuntu
Re:ListView, custom Adapter e Cursor
« Risposta #2 il: 22 Luglio 2010, 14:20:19 CEST »
0
Ottimo!Ora la lista viene visualizzata, però non funziona bene la visualizzazione dell'imageView. Idealmente lo scopo sarebbe questo: ho questa lista di elementi, che posso filtrare attraverso una EditText in cui ogni carattere che inserisco restituisce la lista aggiornata (e che attualmente non funziona). Quando clicco su un elemento, su quell'elemento viene visualizzata un icona e in più esegue altre operazioni non attinenti. Il problema è che quando clicco ora, viene visualizzata un'icona non solo su quell'elemento, ma un elemento ogni tot a partire da quello dopo presenta l'icona. Spero di essermi spiegato bene :| Puoi aiutarmi?
Grazie davvero.

Offline daimadoshi85

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S 2
  • Play Store ID:
    Luca Bonora
  • Sistema operativo:
    Ubuntu
Re:ListView, custom Adapter e Cursor
« Risposta #3 il: 22 Luglio 2010, 20:35:05 CEST »
0
C'ho messo un po' ma sono riuscito a risolvere utilizzando solo il simpleCursorAdapter :)
Grazie!