[英]Android ListView Issues in Android 2.X
我創建了一個自定義數組適配器來填充列表視圖,當活動加載列表視圖文本時消失。
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>
這就是它在Load上的顯示方式
在嘗試滾動內容時重新出現。
你必須刪除
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中,我做的唯一真正的改變是禁用小於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
對於適配器,我強烈重新使用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.