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