Проблемы с ListView для Android в Android 2.X

Я создал Custom Array Adapter, чтобы заполнить List List, и при загрузке Activity Loads List List исчезнет.

PlacesListAdapter.java

public class PlacesListAdapter extends ArrayAdapter<Place> implements Filterable { public Context context; private List<Place> places, orig, itemDetailsrrayList; private PlaceFilter filter; public PlacesListAdapter(Context context, int textViewResourceId) { super(context, textViewResourceId); } public PlacesListAdapter(Context context, int resource, List<Place> places) { super(context, resource, places); this.context = context; this.places = places; itemDetailsrrayList = places; orig = new ArrayList<Place>(itemDetailsrrayList); filter = new PlaceFilter(); // imageLoader = new ImageLoader(context.getApplicationContext()); } public int getCount() { return itemDetailsrrayList.size(); } public Place getItem(int position) { return itemDetailsrrayList.get(position); } public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; if (view == null) { LayoutInflater inflater = (LayoutInflater) getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(R.layout.list_item_place, null); } Place place = places.get(position); if (place != null) { TextView place_name = (TextView) view .findViewById(R.id.place_title); TextView place_distance = (TextView) view .findViewById(R.id.place_distance); ImageView place_category_icon = (ImageView) view .findViewById(R.id.place_category_icon); if (place_name != null) { place_name.setText(place.getPlaceTitle()); } if (place_distance != null) { place_distance.setText("198"); } if (place_category_icon != null) { place_category_icon.setImageResource(R.drawable.icon_category); } } // Setting Alternative Row Colors if (position % 2 == 0) { view.setBackgroundResource(R.drawable.list_view_place_row_1); } else { view.setBackgroundResource(R.drawable.list_view_place_row_2); } return view; } @Override public Filter getFilter() { // TODO Auto-generated method stub return filter; } private class PlaceFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults oReturn = new FilterResults(); ArrayList<Place> results = new ArrayList<Place>(); if (orig == null) orig = itemDetailsrrayList; if (constraint != null) { if (orig != null && orig.size() > 0) { for (Place g : orig) { if (g.getPlaceTitle() .toLowerCase() .startsWith(constraint.toString().toLowerCase())) results.add(g); } } oReturn.values = results; } return oReturn; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { itemDetailsrrayList = (ArrayList<Place>) results.values; notifyDataSetChanged(); } } } 

Place.java

 public class Place { Integer placeId; String placeName = "", placeDistance = "", placeCategoryIcon = ""; public Place(int placeId, String placeName, String placeDistance, String placeCategoryIcon) { this.placeId = placeId; this.placeName = placeName; this.placeDistance = placeDistance; this.placeCategoryIcon = placeCategoryIcon; } public Integer getPlaceId() { return placeId; } public void setPlaceId(int placeId) { this.placeId = placeId; } public String getPlaceName() { return placeName; } public void setPlaceName(String placeName) { this.placeName = placeName; } public String getPlaceDistance() { return placeDistance; } public void setPlaceDistance(String placeDistance) { this.placeDistance = placeDistance; } public String getPlaceCategoryIcon() { return placeCategoryIcon; } public void setPlaceCategoryIcon(String placeCategoryIcon) { this.placeCategoryIcon = placeCategoryIcon; } } 

Основная деятельность

  protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(Window.FEATURE_ACTION_BAR); setContentView(R.layout.activity_main); context = this; Log.i("Nomad", "onCreate"); List<Place> thePlaces = new ArrayList<Place>(); for (int i = 0; i < places.length; i++) { Place pl = new Place(i, places[i], "NO_DISTANCE", "NO_CATEGORYICON"); thePlaces.add(pl); } listView = (ListView) findViewById(R.id.place_list); listView.setEmptyView(findViewById(R.id.empty)); adapter = new PlacesListAdapter(MainActivity.this, thePlaces); listView.setAdapter(adapter); listView.setTextFilterEnabled(true); mSearchView = (SearchView) findViewById(R.id.action_search); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> a, View view, int position, long id) { startActivity(new Intent(MainActivity.this, PlaceActivity.class)); } }); } 

activity_main.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/primary_white" > <ListView android:id="@+id/place_list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:cacheColorHint="#00000000" android:fadingEdge="none" > </ListView> <TextView android:id="@+id/empty" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:padding="20dp" android:text="@string/list_view_place_empty" android:textColor="@color/black" android:textSize="18sp" /> </LinearLayout> 

list_item_place.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:paddingBottom="10dp" android:paddingTop="10dp" > <ImageView android:id="@+id/place_category_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:contentDescription="ss" android:paddingLeft="10dp" android:paddingRight="15dp" android:src="@drawable/icon_category" /> <TextView android:id="@+id/place_distance" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:paddingRight="15dp" android:textColor="@color/black" android:text="320" /> <TextView android:id="@+id/place_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toRightOf="@+id/place_category_icon" android:ellipsize="end" android:paddingRight="50dp" android:singleLine="true" android:text="Place Name" android:textColor="#191919" android:textSize="18sp" /> </RelativeLayout> 

Вот как это выглядит при загрузке

Введите описание изображения здесь

При попытке прокрутки содержимое снова появляется. Введите описание изображения здесь

Вы должны удалить

 getWindow().requestFeature(Window.FEATURE_ACTION_BAR); 

Window.FEATURE_ACTION_BAR добавлен в Honeycomb (3.0) и недоступен для устройств Android 2.x. Чтобы оставаться совместимым со старыми версиями, вы можете использовать этот фрагмент в MainActivity.java:

 int currentapiVersion = android.os.Build.VERSION.SDK_INT; if (currentapiVersion >= 11) { getWindow().requestFeature(Window.FEATURE_ACTION_BAR); } 

ДОПОЛНИТЕЛЬНЫЙ КОД: (это производные классы из вашего примера выше, некоторые элементы должны были быть изменены, прокомментированы или каким-то образом обработаны для компиляции из-за отсутствующих классов)

MainActivity.java

В MainActivity единственное реальное изменение, которое я сделал, это отключить Actionbar для уровней api, меньших, чем 11. А также начать notifyDatasetchanged () после вставки мест.

 public class MainActivity extends Activity { protected static final String TAG = "MainActivity"; private MainActivity context; private ListView listView; private PlacesListAdapter adapter; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.v(TAG, "onCreate()"); int currentapiVersion = android.os.Build.VERSION.SDK_INT; if (currentapiVersion >= 11) { getWindow().requestFeature(Window.FEATURE_ACTION_BAR); } setContentView(R.layout.activity_main); context = this; Log.i("Nomad", "onCreate"); List<Place> thePlaces = new ArrayList<Place>(); String[] places = new String[10]; places[0] = "hallo1"; places[1] = "hallo2"; places[2] = "hallo3"; places[3] = "hallo4"; places[4] = "hallo5"; places[5] = "hallo6"; places[6] = "hallo7"; places[7] = "hallo8"; places[8] = "hallo9"; places[9] = "hallo10"; for (int i = 0; i < places.length; i++) { Place pl = new Place(i, places[i], "NO_DISTANCE", "NO_CATEGORYICON"); thePlaces.add(pl); } listView = (ListView) findViewById(R.id.place_list); listView.setEmptyView(findViewById(R.id.empty)); adapter = new PlacesListAdapter(this, R.layout.list_item_place, thePlaces); listView.setTextFilterEnabled(true); // mSearchView = (SearchView) findViewById(R.id.action_search); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> a, View view, int position, long id) { startActivity(new Intent(MainActivity.this, MainActivity.class)); } }); listView.setAdapter(adapter); **adapter.notifyDataSetChanged();** } } 

PlacesListAdapter.java

Для адаптера я настоятельно рекомендую использовать ViewHolder, который содержит ссылки TextViews и ImageView для каждого элемента List-Element-View.

 public class PlacesListAdapter extends ArrayAdapter<Place> implements Filterable { private static final String TAG = "PlacesListAdapter"; public Context context; private List<Place> places, orig, itemDetailsrrayList; private PlaceFilter filter; public PlacesListAdapter(Context context, int textViewResourceId) { super(context, textViewResourceId); } public PlacesListAdapter(Context context, int resource, List<Place> places) { super(context, resource, places); this.context = context; this.places = places; itemDetailsrrayList = places; orig = new ArrayList<Place>(itemDetailsrrayList); filter = new PlaceFilter(); // imageLoader = new ImageLoader(context.getApplicationContext()); } public int getCount() { return itemDetailsrrayList.size(); } public Place getItem(int position) { return itemDetailsrrayList.get(position); } public long getItemId(int position) { return position; } /** * This is the holder that will provide fast access to arbitrary objects and * views. Use a subclass to adapt it for your needs. */ public static class ViewHolder { private final TextView place_name; private final TextView place_distance; private final ImageView place_category_icon; public ViewHolder(TextView place_name, TextView place_distance, ImageView place_category_icon) { this.place_name = place_name; this.place_distance = place_distance; this.place_category_icon = place_category_icon; } } protected ViewHolder createHolder(View v) { TextView place_name = (TextView) v.findViewById(R.id.place_title); TextView place_distance = (TextView) v .findViewById(R.id.place_distance); ImageView place_category_icon = (ImageView) v .findViewById(R.id.place_category_icon); ViewHolder tvshowHolder = new ViewHolder(place_name, place_distance, place_category_icon); return tvshowHolder; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; ViewHolder holder; if (view == null) { LayoutInflater inflater = (LayoutInflater) this.context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(R.layout.list_item_place, null); // Log.v(TAG, "generating new view"); holder = createHolder(view); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } Place place = places.get(position); if (place != null) { // Log.v(TAG, place.getPlaceName()); if (holder.place_name != null) { // Log.v(TAG, "setting placeName to " + place.getPlaceName()); // place_name.setText(place.getPlaceTitle()); holder.place_name.setText(place.getPlaceName()); } if (holder.place_distance != null) { holder.place_distance.setText("198"); } if (holder.place_category_icon != null) { holder.place_category_icon .setImageResource(R.drawable.ic_launcher); } } // Setting Alternative Row Colors if (position % 2 == 0) { view.setBackgroundResource(R.drawable.ic_launcher); } else { view.setBackgroundResource(R.drawable.ic_launcher); } return view; } @Override public Filter getFilter() { // TODO Auto-generated method stub return filter; } private class PlaceFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults oReturn = new FilterResults(); ArrayList<Place> results = new ArrayList<Place>(); if (orig == null) orig = itemDetailsrrayList; if (constraint != null) { if (orig != null && orig.size() > 0) { for (Place g : orig) { if (g.getPlaceTitle() .toLowerCase() .startsWith(constraint.toString().toLowerCase())) results.add(g); } } oReturn.values = results; } return oReturn; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { itemDetailsrrayList = (ArrayList<Place>) results.values; notifyDataSetChanged(); } } }