convertView wird als null übergeben, auch wenn die Sicht vorhanden ist
Mir entwickelte android-Anwendung, wo Bild und text werden in einem raster angezeigt anzeigen und wenn der Benutzer scrollt nächsten zehn items(Bild und text) angezeigt werden. Das problem entsteht, wenn die getView-Methode des Adapters aufgerufen wird, nachdem adapter.notifyDataSetChanged() aufrufen. Der adapter recycelt die Daten, sondern die Positionen werden neu geordnet und wiederholt in der grid-Ansicht. Ich hatte nicht konfrontiert mit diesem problem, bis ich fügte hinzu, den Zustand zu überprüfen, wenn der convertView null ist.
Activity-Klasse :
public class DynamicListViewActivity extends Activity implements
OnScrollListener {
int visibleElements;
int scrollState;
int count;
TextAdapter adapter = new TextAdapter();
int total=200;//total items limit in grid view
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.grid);
count=10;
GridView grid = (GridView) findViewById(R.id.gridview);
grid.setAdapter(adapter);
grid.setOnScrollListener(this);
}
public void onScroll(AbsListView view, int firstVisible, int visibleCount,
int totalCount) {
visibleElements= visibleCount;
}
public void onScrollStateChanged(AbsListView v, int s) {
Log.d("ScrollState", s+"");
scrollState=s;
isScrollStateComplete();
}
public void isScrollStateComplete(){
if(visibleElements>0 && scrollState==SCROLL_STATE_IDLE && total>count){
int diff=total-count;
count+=(diff>=10)?10:diff;//update count to next ten items
adapter.notifyDataSetChanged();
}
}
class TextAdapter extends BaseAdapter {
public int getCount() {
return count;
}
public Object getItem(int pos) {
return pos;
}
public long getItemId(int pos) {
return pos;
}
public View getView(int pos, View convertView, ViewGroup p) {
View v = convertView;
System.out.println("pos : "+pos+" boolean "+(v==null));//log to check position and convertView
if(v==null){
v =((LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.textlayout,null);
ImageView iv = (ImageView) v.findViewById(R.id.album_thumbnail);
iv.setImageDrawable(getResources().getDrawable(R.drawable.icon));
TextView tvAlbumName = (TextView)v.findViewById(R.id.album_name);
tvAlbumName.setText("postion "+pos);
TextView tvAlbumDesc = (TextView)v.findViewById(R.id.album_description);
tvAlbumDesc.setText("");
}
return v;
}
}
}
Scrollen, bevor der grid-Ansicht korrekt dargestellt wird. Log :
08-05 14:24:34.440: INFO/ActivityManager(58): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.mis.list.demo/.DynamicListViewActivity }
08-05 14:24:34.642: INFO/System.out(685): pos : 0 boolean true
08-05 14:24:34.710: INFO/System.out(685): pos : 0 boolean false
08-05 14:24:34.710: INFO/System.out(685): pos : 1 boolean true
08-05 14:24:34.730: INFO/System.out(685): pos : 2 boolean true
08-05 14:24:34.800: INFO/System.out(685): pos : 3 boolean true
08-05 14:24:34.860: INFO/System.out(685): pos : 4 boolean true
08-05 14:24:34.880: INFO/System.out(685): pos : 5 boolean true
08-05 14:24:34.910: INFO/System.out(685): pos : 6 boolean true
08-05 14:24:34.920: INFO/System.out(685): pos : 7 boolean true
08-05 14:24:34.960: INFO/System.out(685): pos : 0 boolean true
08-05 14:24:35.030: INFO/ActivityManager(58): Displayed activity com.mis.list.demo/.DynamicListViewActivity: 520 ms (total 520 ms)
Nach ersten Ende scrollen
08-05 14:26:15.740: DEBUG/ScrollState(685): 1
08-05 14:26:15.830: DEBUG/dalvikvm(685): GC_EXTERNAL_ALLOC freed 3624 objects / 257464 bytes in 71ms
08-05 14:26:16.210: INFO/System.out(685): pos : 8 boolean false
08-05 14:26:16.210: INFO/System.out(685): pos : 9 boolean true
08-05 14:26:16.250: DEBUG/ScrollState(685): 0
08-05 14:26:16.260: INFO/System.out(685): pos : 0 boolean true
08-05 14:26:16.271: INFO/System.out(685): pos : 0 boolean false
08-05 14:26:16.271: INFO/System.out(685): pos : 1 boolean false
08-05 14:26:16.271: INFO/System.out(685): pos : 2 boolean false
08-05 14:26:16.271: INFO/System.out(685): pos : 3 boolean false
08-05 14:26:16.271: INFO/System.out(685): pos : 4 boolean false
08-05 14:26:16.271: INFO/System.out(685): pos : 5 boolean false
08-05 14:26:16.280: INFO/System.out(685): pos : 6 boolean false
08-05 14:26:16.280: INFO/System.out(685): pos : 7 boolean false
08-05 14:26:16.280: INFO/System.out(685): pos : 8 boolean false
08-05 14:26:16.280: INFO/System.out(685): pos : 9 boolean false
08-05 14:26:16.280: INFO/System.out(685): pos : 10 boolean false
08-05 14:26:16.280: INFO/System.out(685): pos : 11 boolean true
08-05 14:26:16.371: DEBUG/dalvikvm(685): GC_EXTERNAL_ALLOC freed 644 objects / 33224 bytes in 41ms
08-05 14:26:45.270: WARN/KeyCharacterMap(685): No keyboard for id 0
08-05 14:26:45.270: WARN/KeyCharacterMap(685): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
08-05 14:26:45.341: INFO/System.out(685): pos : 12 boolean true
08-05 14:26:45.351: INFO/System.out(685): pos : 13 boolean true
08-05 14:26:45.371: INFO/System.out(685): pos : 14 boolean true
08-05 14:26:45.380: INFO/System.out(685): pos : 15 boolean true
08-05 14:26:45.450: INFO/System.out(685): pos : 16 boolean false
08-05 14:26:45.450: INFO/System.out(685): pos : 17 boolean false
08-05 14:26:45.460: INFO/System.out(685): pos : 18 boolean false
08-05 14:26:45.460: INFO/System.out(685): pos : 19 boolean false
Aber zeigt das raster mit wiederholten Werten und nicht in der Reihenfolge, die es sollte.
Sorry, ich bin nicht erlaubt, post Bilder, wie ich bin neuer Benutzer.
In der log sehe ich, dass für die position 0 der convertView==null wahr ist.
wie man dies Recht, wie ich planen, zu downloaden der Bilder in den Ort der android-Symbol für Bild-Ansicht derzeit verwendet wird.
Bitte helfen.
- Falls keine Ansicht für die Wiederverwendung verfügbar, Android wird, übergeben Sie null für den parameter convertView
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre interpretation der convertView ist falsch.
ist, was Sie tun sollten.
Als Ergebnis von dem, was Sie Taten, in Fällen, in denen
convertView
war nicht null, Sie waren einfach wieder convertView, ohne die Aktualisierung Ihrer Daten, und damit Ihre Bilder wurden nicht wiederholt. Nur in Fällen, in denenconvertView
null war, wurden Sie die Einstellung Ihrer Daten.Vertrag zwischen dem adapter und dem list-view-system: Wenn der übergebene
convertView
null ist, erstellen Sie ein neues, anderes wieder verwenden.Vikram Bodicherla korrekt ist (+1), Ihre Umsetzung ist falsch, und seine Codebeispiel ordnungsgemäß behebt Ihr Problem. Ich möchte jedoch empfehlen, die folgenden Google I/O 2010 Vortrag: Die Welt der ListView. Es ist eine Stunde lang, aber Sie haben ein viel tieferes Verständnis von, wie die
ListView
funktioniert und wie Sie schreiben sollten, dass Ihr adapter richtig mit ihm zusammenzuarbeiten.Wenn Android feststellt, dass eine Ansicht, die darstellt, eine Zeile ist nicht mehr sichtbar es ermöglicht die getView () - Methode zu verwenden es über die convertView-parameter.
Einer Leistung optimiert adapter weist die neuen Daten an die convertView. Dies vermeidet das aufblasen einer XML-Datei und erstellen Sie neue Java-Objekte.
Falls keine Ansicht für die Wiederverwendung verfügbar, Android wird übergeben Sie null, um die convertView-parameter. Daher die adapter-Implementierung brauchen, um dies zu überprüfen.