Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用ListView扩展相同布局的两个片段不是唯一的_Android_Sqlite_Listview_Fragment_Baseadapter - Fatal编程技术网

Android 使用ListView扩展相同布局的两个片段不是唯一的

Android 使用ListView扩展相同布局的两个片段不是唯一的,android,sqlite,listview,fragment,baseadapter,Android,Sqlite,Listview,Fragment,Baseadapter,我正在创建一个小型Financecontrol应用程序。现在我面临着一个问题,我认为如果不打我的手机,我无法处理这个问题 我得到了一个活动,其中有一个从Android模板创建的ViewPager。 我有三个标签。第二个和第三个选项卡使用相同的片段类。以下是选项卡的代码段: 在会计活动中: @Override public Fragment getItem(int position) { Fragment fragment = null;

我正在创建一个小型Financecontrol应用程序。现在我面临着一个问题,我认为如果不打我的手机,我无法处理这个问题

我得到了一个活动,其中有一个从Android模板创建的ViewPager。 我有三个标签。第二个和第三个选项卡使用相同的片段类。以下是选项卡的代码段:

在会计活动中:

@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());
    }
}
通过长时间单击列表项,我获得了事务的ID,该ID应该与数据库中的ID相同(自动递增主键等)。所以它应该是独一无二的。但支出列表上的第一项与收入列表上的第一项具有相同的id。通过从收入列表中删除一个项目,结果列表中的最后一个项目会得到一个边界外的例外,因为理论上应该比显示的少一个。但结果列表不像收入那样刷新自己,更像是具有不同价值的收入的“副本”

希望你明白我的问题。。。。 如果您需要更多代码,请告诉我=)

编辑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、日期、值、描述、标志)==>ex1:(2013年8月23日,33.33,“小费”、“i”)用于收入数据集,ex2:(2013年8月23日,12.12,“罚单”、“o”)用于结果数据集

下面是一些图片: 第一个条目的getID()为的收入屏幕--> 第一个条目的getID()为-->

编辑2: 我在以下方面的帮助下解决了问题:

您必须使用此命令包装onContextItemSelected调用,因为fragmentmanager获取第一个返回contextmenu true的可用片段,而不是您实际使用的片段

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

我不明白这个问题。使用标志时,数据有什么不同?你期望不同的数据,还是相同的两倍?嗨。我将提供有关表格本身的更多信息。我有不同的数据,在两个列表视图中都正确显示。但是很明显,这两个片段或列表视图是相互“连接”的。一方面的变化对另一方面有影响。我不明白为什么会这样。看起来问题在于上下文菜单。。。。我想菜单只提到了第一个片段的列表。。。。
if (getUserVisibleHint()) {
    // Handle menu events and return true
} else
    return false; // Pass the event to the next fragment
}