简体   繁体   中英

Android ListView Issues in Android 2.X

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM