我有一个由具有特定布局的自定义适配器填充的ListView。适配器通过包含每个ListView元素的数据的特定元素映射到HashMap。
hashMap中的数据是正确的,但是ListView重复以相同的第6个元素为第6个元素再次绘制,直到到达Map的末尾。
我的显示允许显示5个项目,如果您滚动一个纸屑,则可以显示6个项目。
这是适配器的代码,ListActivity的相关代码和ListView的布局文件。
请帮助,我不知道为什么会这样。
package de.View;
import java.util.ArrayList;
import java.util.Map;
import de.carSync.R;
import de.Common.Date_Conversion;
import de.Common.GUI_Output;
import de.Model.DriversLog.Fahrt;
import de.Model.DriversLog.Geladene_Fahrten;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class Fahrten_List_Adapter extends BaseAdapter{
private static String TAG = "Fahrten_List_Adapter";
private Map<Integer,Fahrt> fahrten_Liste;
private final LayoutInflater mLayoutInflater;
int zeilen_Layout;
public Fahrten_List_Adapter(Context ctx, Map<Integer,Fahrt> f_l, int zeilen_Layout){
this.zeilen_Layout = zeilen_Layout;
fahrten_Liste = f_l;
mLayoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return fahrten_Liste.size();
}
@Override
public Object getItem(int pos) {
return fahrten_Liste.get(pos);
}
@Override
public long getItemId(int pos) {
return 0;
}
public void clear(){
fahrten_Liste.clear();
}
@Override
public View getView(int pos, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = mLayoutInflater.inflate(zeilen_Layout, null);
Log.v(TAG,"getView :" + pos);
((TextView) convertView.findViewById(R.id.FahrtID)).setText( (String) ((Fahrt) getItem(pos)).get_Fahrt_ID() );
((TextView) convertView.findViewById(R.id.Kennzeichen)).setText( (String) ((Fahrt) getItem(pos)).get_Kennzeichen() );
((TextView) convertView.findViewById(R.id.Abfahrts_Strasse)).setText( (String) ((Fahrt) getItem(pos)).get_Abfahrts_Strasse().toString() );
((TextView) convertView.findViewById(R.id.Ankunfts_Strasse)).setText( (String) ((Fahrt) getItem(pos)).get_Ankunfts_Strasse().toString() );
((TextView) convertView.findViewById(R.id.Fahrttyp)).setText( (String) GUI_Output.get_Fahrttyp((Object) ((Fahrt) getItem(pos)).get_Fahrttyp() ));
((TextView) convertView.findViewById(R.id.Abfahrts_Stadt)).setText( (String) ((Fahrt) getItem(pos)).get_Abfahrts_Stadt().toString() );
((TextView) convertView.findViewById(R.id.Ankunfts_Stadt)).setText( (String) ((Fahrt) getItem(pos)).get_Ankunfts_Stadt().toString() );
((TextView) convertView.findViewById(R.id.Dauer)).setText( (String) ((Fahrt) getItem(pos)).get_Fahrt_Dauer().toString() );
((TextView) convertView.findViewById(R.id.Abfahrts_Zeit2)).setText( (String) Date_Conversion.get_GUI_Date( ((Fahrt) getItem(pos)).get_Abfahrtszeit_Date() ));
((TextView) convertView.findViewById(R.id.Ankunfts_Zeit2)).setText( (String) Date_Conversion.get_GUI_Date( ((Fahrt) getItem(pos)).get_Ankunftszeit_Date() ));
((TextView) convertView.findViewById(R.id.Entfernung)).setText( (String) ((Fahrt) getItem(pos)).get_Fahrt_Entferung().toString() );
((TextView) convertView.findViewById(R.id.Abfahrts_Km)).setText( (String) ((Fahrt) getItem(pos)).get_Abfahrt_km().toString() );
((TextView) convertView.findViewById(R.id.Ankunfts_Km)).setText( (String) ((Fahrt) getItem(pos)).get_Ankunfts_km().toString() );
//}
}
return convertView;
}
}
package de.View;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URISyntaxException;
import java.util.Stack;
import org.json.JSONException;
import de.carSync.R;
import de.Controler.Drivers_Log_Controller;
import de.Controler.Global_Controller;
import android.app.Activity;
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class Drivers_Log_View extends ListActivity implements AbsListView.OnScrollListener {
Drivers_Log_Controller d_l_c;
Fahrten_List_Adapter f_l_a_ohne_Auswahl;
ListView view_ohne_auswahl;
static String TAG = "Drivers_Log_View";
/** Called when the activity is first created. */
@SuppressWarnings("unchecked")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.d_l_c = (Drivers_Log_Controller) Global_Controller.get_Controller_Map().get("actual d_l_c");
this.setContentView(R.layout.list_view);
try {
d_l_c.lade_Standard_Fahrten(null);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.v(TAG, "now creating Fahrten_List_Adapter");
f_l_a_ohne_Auswahl = new Fahrten_List_Adapter(this, d_l_c.get_Fahrten(), R.layout.fahrt_linear_ohne_auswahl);
this.setListAdapter(f_l_a_ohne_Auswahl);
d_l_c.listAdapter = this.getListAdapter();
ListView lv = this.getListView();
lv.setOnScrollListener(this);
//addListeners();
}
public void init() {
//
}
public Drivers_Log_Controller get_D_L_C() {
return this.d_l_c;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.fahrtenbuch_menue_bar, menu);
Log.v(TAG, "Do I get here");
return true;
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
Log.v(TAG, "ListView Position :" + position);
super.onListItemClick(l, v, position, id);
Global_Controller.start_Fahrt(position);
}
@SuppressWarnings("unchecked")
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.fahrtenbuch: {
try {
d_l_c.lade_Standard_Fahrten(null);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.setListAdapter(d_l_c.get_List_Adapter());
}
break;
case R.id.unv_Fahrten: {
try {
d_l_c.lade_Unvollstaendige_Fahrten(null);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.setListAdapter(d_l_c.get_List_Adapter());
}
break;
case R.id.filter: {
Global_Controller.start_Filter();
break;
}
case R.id.zusammenfassen: {
Log.v(TAG, "Menu --- Zusammenfassen");
Global_Controller.start_Zusammenfassen();
}
break;
}
return true;
}
@Override
public void onScroll(AbsListView arg0, int firstVisible, int visibleCount,
int totalCount) {
Log.v(TAG, "firstVisible :" + firstVisible);
Log.v(TAG, "visibleCount :" + visibleCount);
Log.v(TAG, "totalCount :" + totalCount);
boolean endReached = firstVisible + visibleCount >= totalCount;
if (endReached) {
try {
Log.v(TAG, "EndReached");
d_l_c.nachladen_Fahrten(totalCount);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void onScrollStateChanged(AbsListView arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onResume() {
super.onResume();
this.setListAdapter(d_l_c.get_List_Adapter());
Log.v(TAG, "OnResume");
}
}
<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
<ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFF" android:divider="#000000" android:dividerHeight="3px" android:cacheColorHint="#FFFFFF" />
<TextView android:id="@android:id/empty" android:text="nix da...." android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFF" android:divider="#000000" android:dividerHeight="3px" android:cacheColorHint="#FFFFFF" />
</LinearLayout>
最佳答案
@Override
public View getView(int pos, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = mLayoutInflater.inflate(zeilen_Layout, null);
//Assignment code
}
return convertView;
}
发生这种情况的原因是由于您如何定义此方法(即
getView()
)。如果它是null
,它只会修改convertView对象,但是在第一页项目填满后,Android将开始回收View对象。这意味着传入的第七个对象不为空-先前滚动到屏幕顶部(第一项)的是该对象。有条件的原因是您只返回传递给方法的内容,因此它似乎一遍又一遍地重复相同的6个项目。
关于android - 为什么ListView每6个项目重复一次?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6470089/