[英]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 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 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 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 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 这就是它在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. Window.FEATURE_ACTION_BAR已添加到Honeycomb(3.0)中,不适用于Android 2.x设备。 To stay compatible to older Versions you might use this snippet in MainActivity.java: 要与旧版本保持兼容,您可以在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 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. 在MainActivity中,我做的唯一真正的改变是禁用小于11的api级别的Actionbar。并且在插入位置后也启动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 PlacesListAdapter.java
For the Adapter I strongly recoomend to use a ViewHolder, which contains the TextViews and ImageView references for each List-Element-View. 对于适配器,我强烈重新使用ViewHolder,它包含每个List-Element-View的TextViews和ImageView引用。
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();
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.