2

我正在创建一个小型 Financecontrol-App。现在我面临一个问题,我认为不打手机就无法解决=D

我得到了一个带有从 Android 模板创建的 ViewPager 的 Activity。我有 3 个标签。第二个和第三个选项卡使用相同的 Fragment-Class。这是选项卡的片段:

在 AccountActivity 中:

@Override
        public Fragment getItem(int position) {
            Fragment fragment = null;
            Bundle args = new Bundle();
            switch (position) {
            case POSITION_OVERVIEW:
                fragment = new OverviewSectionFragment();
                break;
            case POSITION_INCOME:
                args.putString("flag", TransactionSectionFragment.INCOME);
                fragment = new TransactionSectionFragment();
                fragment.setArguments(args);
                break;
            case POSITION_OUTGO:
                args.putString("flag", TransactionSectionFragment.OUTGO);
                fragment = new TransactionSectionFragment();
                fragment.setArguments(args);
                break;
            }
            return fragment;
        }

片段本身看起来像这样:

public class TransactionSectionFragment extends Fragment {

    OnDataChangedListener mCallback;

    public interface OnDataChangedListener {
        public void onDataChanged(int rnd);
    }

    // Private variables for IncomeSectionFragment
    private FinanceDataSource datasource;
    private ListView transactionList;
    private CustomFinanceListAdapter adapter;
    private String flag;
    private Button newTran;

    // public constants
    public static final String INCOME = "i";
    public static final String OUTGO = "o";

    // Variables for Contextmenu
    private static final int DETAILS_OPTION = Menu.FIRST;
    private static final int DELETE_OPTION = DETAILS_OPTION + 1;

    public TransactionSectionFragment() {

    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mCallback = (OnDataChangedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnDataChangedListener");
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(
                R.layout.fragment_account_transactions, container, false);
        return rootView;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        newTran = (Button) getView().findViewById(R.id.new_entry_btn);
        transactionList = (ListView) this.getView().findViewById(
                R.id.transactionlist);
        flag = getArguments().getString("flag");

        datasource = new FinanceDataSource(getActivity());
        datasource.open();
        updateList();
        registerForContextMenu(transactionList);

        transactionList
                .setOnItemClickListener(new AdapterView.OnItemClickListener() {

                    @Override
                    public void onItemClick(AdapterView<?> arg0, View arg1,
                            int position, long arg3) {
                        Transaction tran = (Transaction) transactionList
                                .getItemAtPosition(position);
                        showTransactionDetails(tran);
                    }

                });

        newTran.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                datasource.insertSomeTransactions();
                updateList();
            }
        });
    }

    @Override
    public void onResume() {
        datasource.open();
        super.onResume();
    }

    @Override
    public void onPause() {
        datasource.close();
        super.onPause();
    }

    private void showTransactionDetails(Transaction tran) {

    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        if (v.getId() == R.id.transactionlist) {
            menu.setHeaderTitle("Optionen ");
            menu.add(Menu.NONE, DETAILS_OPTION, 0, "Details");
            menu.add(Menu.NONE, DELETE_OPTION, 1, "Eintrag löschen");
        }
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
                .getMenuInfo();
        Transaction tran = (Transaction) transactionList
                .getItemAtPosition(info.position);
        switch (item.getItemId()) {
        case DETAILS_OPTION:
            showMsg(tran.getID() + "");
            break;
        case DELETE_OPTION:
            try {
                datasource.deleteTransaction(tran);
                updateList();
                showMsg("Entry deleted!");
            } catch (Exception e) {
                Log.i("Exception", e.getMessage());
            }
            break;
        }
        return true;
    }

    // Show Toast
    private void showMsg(String message) {
        Toast msg = Toast.makeText(getActivity(), message, Toast.LENGTH_LONG);
        msg.show();
    }

    private void updateList() {
        adapter = new CustomFinanceListAdapter(
                datasource.getAllTransactions(flag), getActivity());
        transactionList.setAdapter(adapter);
        mCallback.onDataChanged(new Random().nextInt());
    }
}

现在的问题是:代表收入的第一个 Fragment 填充了来自标有“i”的 sqlite 数据库的数据。第二个片段被标记为“o”。这工作得很好。列表视图中的每个条目都代表一个事务 ---> 参见此处:

public class Transaction {
    // private variables
    int id;
    String date;
    double value;
    String desc;
    String flag;

    // Empty constructor
    public Transaction() {

    }

    // constructor
    public Transaction(String date, double value, String desc, String flag) {
        this.date = date;
        this.value = value;
        this.desc = desc;
        this.flag = flag;
    }

    // constructor
    public Transaction(int id, String date, double value, String desc,
            String flag) {
        this.id = id;
        this.date = date;
        this.value = value;
        this.desc = desc;
        this.flag = flag;
    }

    // get name
    public int getID() {
        return this.id;
    }

    // get name
    public String getDate() {
        return this.date;
    }

    // set name
    public void setDate(String date) {
        this.date = date;
    }

    // get value
    public double getValue() {
        return this.value;
    }

    // set value
    public void setValue(double value) {
        this.value = value;
    }

    // get description
    public String getDesc() {
        return this.desc;
    }

    // set description
    public void setDesc(String desc) {
        this.desc = desc;
    }

    // get flag
    public String getFlag() {
        return this.flag;
    }

    // set flag
    public void setFlag(String flag) {
        this.flag = flag;
    }

    @Override
    public String toString() {
        return this.getDesc();
    }
}

通过长按一个列表项,我得到了事务的 ID,它应该与数据库中的相同(自动增量主键等)。所以它应该是独一无二的。但是 outgo-list 上的第一项与 income-list 上的第一项具有相同的 id。通过从收入列表中删除一个项目,结果列表中的最后一个项目会得到一个 outofboundexception,因为理论上应该比显示的少一个。但是结果列表并不像收入那样刷新自己,更像是具有不同值的收入的“副本”。

希望你能解决我的问题......如果你需要更多代码,请告诉我=)

编辑 1:这是创建表的 SQL 语句:

USERS_TABLE_CREATE = "CREATE TABLE "
            + TABLE_FINANCES + " (" + COLUMN_ID
            + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + COLUMN_DATE
            + " DATETIME NOT NULL," + COLUMN_VALUE + " REAL NOT NULL," + COLUMN_DESC
            + " NVARCHAR(255)," + COLUMN_FLAG  + " NVARCHAR(1) NOT NULL);";

数据集本身看起来像:

(id, date, value, description, flag) ==> ex1: (2, 23.08.2013, 33.33, "tip", "i") 用于收入数据集和 ex2: (3, 23.08.2013, 12.12, "票”,“o”)用于结果数据集

现在一些图片:第一个条目的getID()的收入屏幕-> http://i.imgur.com/kfCkjGr.png第一个条目 的getID()的输出屏幕-> http://i.imgur.com /tOdoSqb.png

编辑 2:我在以下帮助下解决了问题: ViewPager 中的错误片段接收 onContextItemSelected 调用

你必须用这个包装 onContextItemSelected 调用,因为 fragmentmanager 需要第一个为 contextmenu 返回 true 的可用片段,而不是你实际使用的片段

if (getUserVisibleHint()) {
    // Handle menu events and return true
} else
    return false; // Pass the event to the next fragment
}
4

0 回答 0