子アクティビティのリスト ビューが親アクティビティのリスト ビューのコンテンツを更新するという問題があります。
基本的に、親アクティビティ (DetailActivity) には、次のコードを入力する lvContacts というリスト ビューがあります。
ListView lvDetail = (ListView)findViewById(R.id.lvContacts);
SingleLineAdapter adapter = new SingleLineAdapter(this, Items);
lvDetail.setAdapter(adapter);
lvDetail.setSelector(R.drawable.generic_selector);
Items は GenericDataObject の ArrayList です。
public class GenericDataObject implements Serializable {
private static final long serialVersionUID = 7661717999129942666L;
private String Id;
private String Description;
private String RawData;
// getters and setters snipped for smaller code
}
SingleLineAdapter は次のようになります。
public class SingleLineAdapter extends CustomListAdapter implements Filterable {
private static ArrayList<GenericDataObject> ObjectArray;
private static ArrayList<GenericDataObject> OriginalArray;
private LayoutInflater layoutInflater;
private String SearchedText = "";
private Context OriginatingContext;
public SingleLineAdapter(Context context, ArrayList<GenericDataObject> Objects) {
OriginatingContext = context;
ObjectArray = Objects;
OriginalArray = Objects;
layoutInflater = LayoutInflater.from(context);
if (Objects != null)
Collections.sort(Objects, ObjectComparator);
}
private Comparator<GenericDataObject> ObjectComparator = new Comparator<GenericDataObject>() {
@Override
public int compare(GenericDataObject object1,
GenericDataObject object2) {
return object1.getDescription().compareTo(object2.getDescription());
}
};
@Override
public int getCount() {
return ObjectArray.size();
}
@Override
public Object getItem(int position) {
return ObjectArray.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.listitem_generic, null);
holder = new ViewHolder();
holder.lblTitle = (TextView)convertView.findViewById(R.id.lblTitle);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.lblTitle.setText(ObjectArray.get(position).getDescription(), TextView.BufferType.SPANNABLE);
if (!SearchedText.equals("")) {
Spannable wordToSpan = (Spannable)holder.lblTitle.getText();
String[] comps;
if (SearchedText.startsWith("\""))
comps = new String[] { SearchedText.substring(1, SearchedText.length() - 1) };
else
comps = SearchedText.split(" ");
String name = holder.lblTitle.getText().toString().toLowerCase();
for(int i = 0; i < comps.length; i++) {
int Start = name.indexOf(comps[i]);
while (Start > -1) {
int End = Start + comps[i].length();
wordToSpan.setSpan(new BackgroundColorSpan(0xFFFF9900), Start, End, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Start = name.indexOf(comps[i], End);
}
}
}
setFont(holder.lblTitle);
return convertView;
}
static class ViewHolder {
TextView lblTitle;
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
SearchedText = constraint.toString();
final FilterResults result = new FilterResults();
final ArrayList<GenericDataObject> custs = new ArrayList<GenericDataObject>();
if(constraint != null) {
String[] searches;
if (constraint.toString().startsWith("\"") && constraint.toString().endsWith("\""))
searches = new String[] { SearchedText.substring(1, SearchedText.length() - 1) };
else
searches = constraint.toString().split(" ");
for(int i = 0; i < OriginalArray.size(); i++) {
String customerName = OriginalArray.get(i).getDescription().toLowerCase();
boolean bNotFound = false;
for(int j = 0; j < searches.length && bNotFound == false; j++) {
String searchFor = searches[j];
if (!customerName.contains(searchFor))
bNotFound = true;
}
if (!bNotFound)
{
custs.add(OriginalArray.get(i));
}
}
result.values = custs;
}
return result;
}
@Override
@SuppressWarnings("unchecked")
protected void publishResults(CharSequence constraint,
FilterResults results) {
ObjectArray = (ArrayList<GenericDataObject>)results.values;
notifyDataSetChanged();
}
};
}
}
Web サービスのデータに対する lvContacts クエリの OnItemClick は、新しいアクティビティを表示します。
Intent detail = new Intent(DetailActivity.this, ContactDetailActivity.class);
detail.putExtra("ListOfDetails", RowsFromService);
startActivity(detail);
RowsFromService も GenericDataObject の ArrayList です。
ContactDetailActivity には、lvContactDetail という ListView があります。これを次のように入力します。
@Override
protected void onCreate(Bundle savedInstanceState) {
ArrayList<GenericDataObject> DetailRows = (ArrayList<GenericDataObject>)getIntent().getExtras().getSerializable("ListOfDetails");
ListView lvContactDetail = (ListView)findViewById(R.id.lvContactDetail);
SingleLineAdapter detailAdapter = new SingleLineAdapter(this, DetailRows);
lvContactDetail.setAdapter(detailAdapter);
lvContactDetail.setSelector(R.drawable.generic_selector);
}
この時点まではすべて完全に機能しますが、戻るボタンまたはボタンの activity.finish() を使用して DetailActivity (親アクティビティ) に戻ると、元のリスト (lvContacts) に lvContactDetail の結果が取り込まれます。
これは私のアプリの 2 つのリストでのみ発生し、残りはすべて 100% 正しく機能しています。
他のリストからリストをロードする際に注意すべき特別な注意事項はありますか? 私のアプリのメイン アクティビティが CLEAR_TOP と REORDER_TO_FRONT のフラグを設定することは注目に値します...
奇妙なことに、子アクティビティの setAdapter 行をコメントアウトしても、親アクティビティはまだ他のアクティビティのデータで更新されています。これは、SingleLineAdapter の新しいインスタンスの作成に関連していますか?