4

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

enter image description here

On trying to Scroll the content reappears. enter image description here

Harsha M V
  • 54,075
  • 125
  • 354
  • 529
  • I always recommend using this method to inflate adapter views: inflater.inflate(R.layout.list_item_place, parent, false); – satur9nine Jan 02 '13 at 20:56

1 Answers1

3

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();
        }

    }
}
AndacAydin
  • 1,416
  • 19
  • 26
  • will that affect the list view ? – Harsha M V Jan 11 '13 at 18:53
  • No,in my local tests everything worked great. If you want some code please let me know and I'll append more to the answer. – AndacAydin Jan 11 '13 at 22:03
  • 1
    Hope the code-example helps, it works fine on both environments I tested them with (api lvl 8 & 16) if you have any questions please don't hesitate to ask :) – AndacAydin Jan 11 '13 at 22:19
  • 1
    Holy cow, I had same problem when using ActionBar with Android 2.3.4 device. Instead of letters, I saw only white rectangles (while my text was supposed to be white). After placing this if statement for API version, problem is gone and text view is displayed correctly right upon Activity start. Thanks man. +1 – uerceg Oct 10 '13 at 12:31
  • Struggling with this same issue as @uerceg for the last 3 days, but our app never requests that feature and uses ActionBarSherlock by extending SherlockFragmentActivity. Any thoughts? – Cruceo Mar 07 '14 at 23:19
  • I'd recommend you to post an new question with some sample code. – AndacAydin Mar 12 '14 at 20:18