0

ListFragmentsそれぞれ異なる SQLite テーブルまたはビューを表示するシリーズがあります。スワイプ可能なタブ レイアウトでそれらを切り替えます。

呼び出される Intent 引数に応じて、同じアクティビティに読み込まれる 2 つの異なるスワイプ可能なレイアウトがあります。アラート ダイアログとアクションバーのボタンは、スワイプ可能なレイアウトを切り替えます。スワイプ可能なタブの設定については、 http: //www.pushing-pixels.org/2011/08/11/android-tips-and-tricks-swipey-tabs.html で説明されています。

アイテムをクリックした後に問題が発生。

android.database.sqlite.SQLiteException: no such column: authorHash: , 
  while compiling: SELECT name, shared, authorHash, primaryMatch 
  FROM contacts_view

例外は、SELECT 句が以下の最初の宣言からのものであるのに対し、VIEW は 2 番目の宣言からのものであることを示しています。

LogFragment.newInstance(PeerDataProvider.URI_RESPONSES_VIEW,
  PeerDataProvider.URI_PEERDATA_TABLE, R.loader.responseslogfragloader,
  PeerCreatedDataColumns.NAME, 
      new String[] { PeerCreatedDataColumns.NAME,
  PeerCreatedDataColumns.SHARED, PeerCreatedDataColumns.AUTHORHASH,
  ResponsesColumns.PRIMARYMATCH });

LogFragment.newInstance(UserDataProvider.URI_CONTACTS_VIEW, 
      UserDataProvider.URI_USERDATA_TABLE, R.loader.contactslogfragloader, 
      UserCreatedDataColumns.NAME,
  new String[] { UserCreatedDataColumns.LONGSUMMARY }); 

呼び出されるフラグメントは次のとおりです。

public class LogFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {
private static int LIST_LOADER;
protected int layout = R.layout.log_fragment;
int entryLayout = R.layout.list_item;
private static Uri logView, logTable;
String[] listItemProjection;
int[] listItemFields = { R.id.title };
String itemClickProjection[];
String[] createProjection;
int mCurCheckPosition = 0;
Button clearLogButton;
protected SimpleCursorAdapter listAdapter;

public static Fragment newInstance(Uri logview, Uri logtable, int listLoader, String displayColumn,
        String[] clickProjection) {
    LogFragment f = new LogFragment();
    Bundle args = new Bundle();
    args.putString("listItemProjection", "" + displayColumn);
    args.putStringArray("itemClickProjection", clickProjection);
    args.putString("logView", "" + logview);
    args.putString("logTable", "" + logtable);
    args.putString("LIST_LOADER", "" + listLoader);
    Log.d(DEBUG_TAG, "listLoader" + listLoader);
    f.setArguments(args);
    return f;
}

public LogFragment() {
    super();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(layout, container, false);

    String listItemProjection_String = getArguments().getString("listItemProjection");
    String[] itemClickProjection_StringArray = getArguments().getStringArray("itemClickProjection");
    String logView_String = getArguments().getString("logView");
    String logTable_String = getArguments().getString("logTable");
    String LIST_LOADER_String = getArguments().getString("LIST_LOADER");
    listItemProjection = new String[] { listItemProjection_String };
    createProjection = new String[] { UserDatabase._ID, listItemProjection_String };
    itemClickProjection = itemClickProjection_StringArray;
    logView = Uri.parse(logView_String);
    logTable = Uri.parse(logTable_String);
    LIST_LOADER = Integer.parseInt(LIST_LOADER_String);

    getLoaderManager().initLoader(LIST_LOADER, null, this);
    listAdapter = new SimpleCursorAdapter(getActivity().getApplicationContext(), entryLayout, null,
            listItemProjection, listItemFields, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
    setListAdapter(listAdapter);
    return view;
}

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    Cursor c = getActivity().getContentResolver().query(logView, itemClickProjection, null, null, null);
    String fields = "";
    c.moveToPosition(position);
    for (String column : itemClickProjection) {
        fields += column + " " + c.getString(c.getColumnIndex(column)) + "\n";
        Toast.makeText(getActivity(), fields, Toast.LENGTH_SHORT).show();
    }
}
}

そしてアダプターはこちら

private class SearchSwipePagerAdapter extends FragmentPagerAdapter implements SwipeyTabsAdapter {
    private final String DEBUG_TAG = "SearchSwipePagerAdapter";
    private final Context mContext;
    public SearchSwipePagerAdapter(Context context, FragmentManager fm) {
        super(fm);
        this.mContext = context;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
        case 0:
            return SearchFragment.newInstance();
        case 1:
            return ResponsesFragment.newInstance();
        case 2:
            return LogFragment.newInstance(PeerDataProvider.URI_RESPONSES_VIEW,
                    PeerDataProvider.URI_PEERDATA_TABLE, R.loader.responseslogfragloader,
                    PeerCreatedDataColumns.NAME, new String[] { PeerCreatedDataColumns.NAME,
                            PeerCreatedDataColumns.SHARED, PeerCreatedDataColumns.AUTHORHASH,
                            ResponsesColumns.PRIMARYMATCH });
        case 3:
            return LogFragment.newInstance(UserDataProvider.URI_CONTACTS_VIEW, UserDataProvider.URI_USERDATA_TABLE,
                    R.loader.contactslogfragloader, UserCreatedDataColumns.NAME,
                    new String[] { UserCreatedDataColumns.LONGSUMMARY });
        case 4:
            return LogFragment.newInstance(PeerDataProvider.URI_METHODS_VIEW, PeerDataProvider.URI_PEERDATA_TABLE,
                    R.loader.methodslogfragloader, PeerCreatedDataColumns.NAME, new String[] {
                            PeerCreatedDataColumns.NAME, PeerCreatedDataColumns.SHARED,
                            PeerCreatedDataColumns.AUTHORHASH, MethodsColumns.PRIMARYMATCH });
        default:
            return SwipeyTabFragment.newInstance(WORKFLOW[position]);
        }
    }

各フラグメントには一意のローダー ID があります。プロジェクト全体で互換モードを維持しています。

4

1 に答える 1

1

この宣言:

private static Uri logView, logTable;

これらの静的変数はインスタンスによって共有されるため、によって構築された最後のフラグメントに渡すLogFragmentものとして常にあることをUris意味します。これらのフィールドをインスタンス変数にします。UrisFragmentPagerAdapterLogFragment

private Uri logView, logTable;
于 2012-12-10T09:25:50.157 に答える