0

子アクティビティのリスト ビューが親アクティビティのリスト ビューのコンテンツを更新するという問題があります。

基本的に、親アクティビティ (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 の新しいインスタンスの作成に関連していますか?

4

1 に答える 1

0

Seems like I'm the only person who actually experiences this problem, so what I've done is to just "reload" the UI portion of the parent activity in onCreate. (Keeping booleans to indicate if the data was loaded or not)

于 2013-03-07T10:00:34.933 に答える