I have created a Custom Array Adapter to populate the List View and when the Activity Loads the List View text Disappears.
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;
}
}
MainActivity
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>
This is how it appears on Load
On trying to Scroll the content reappears.
You have to remove
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
The Window.FEATURE_ACTION_BAR has been added in Honeycomb (3.0) and is not available for Android 2.x devices. To stay compatible to older Versions you might use this snippet in MainActivity.java:
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= 11) {
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
}
ADDITIONAL CODE: (these are derived classes from your example above, some elements had to be changed, commented or somehow manipulated to compile because of missing classes)
MainActivity.java
In MainActivity the only real change I did was to disable the Actionbar for api levels smaller then 11. And also start notifyDatasetchanged() after insertion of places.
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
For the Adapter I strongly recoomend to use a ViewHolder, which contains the TextViews and ImageView references for each 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();
}
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.