【发布时间】:2015-11-30 21:36:04
【问题描述】:
调试后更新
事实证明,convertCursorToTransactionInfoList 和 transactionLoadComplete 从未真正运行过。我在它们上设置了断点,它们从未出现在调试器中。此外,adapterData: size = 0 会在运行调试器时显示。
我能够使用onCreateView 中TransactionInfo returnListValue = new TransactionInfo(); 下的代码正确填充回收站视图的一项
谁能提供一些关于为什么这不起作用的见解?我这样做的次数越来越多,我认为这与ArrayList<> 和List<> 的差异有关,因为ArrayList<> 用于TransactionsTab.java,而AdapterTransactions.java 使用List<> 或 TransactionInfo.java 在某些方面。我已经在下面发布了所有这些类。
SQLite 接口不是问题(我很确定),因为我在应用程序的其他地方使用它来使用SimpleCursorAdapter 填充Spinners。
TransactionsTab.java:
public class TransactionsTab extends Fragment
implements TransactionLoad.LoadComplete {
RecyclerView transactionsRecycler;
AdapterTransactions adapter;
TransactionLoad load = null;
Cursor cursor;
ArrayList<TransactionInfo> adapterData = new ArrayList<>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
load = new TransactionLoad(getActivity());
load.execute();
}
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.tab_transactions,container,false);
transactionsRecycler = (RecyclerView) view.findViewById(R.id.transactionRecycler);
adapter = new AdapterTransactions(getActivity(), adapterData);
transactionsRecycler.setAdapter(adapter);
transactionsRecycler.setLayoutManager(new LinearLayoutManager(getActivity()));
TransactionInfo returnListValue = new TransactionInfo();
returnListValue.itemName = "lunch";
returnListValue.itemCat = "Food";
returnListValue.itemCurrency = "KRW";
returnListValue.itemPrice = "125";
returnListValue.date = "2015/08/25; 17:25:32";
adapterData.add(returnListValue);
return view;
}
private void convertCursorToTransactionInfoList(Cursor cursor) {
if (cursor != null) {
while (cursor.moveToNext()) {
TransactionInfo returnListValue = new TransactionInfo();
returnListValue.itemName = cursor.getString(cursor.getColumnIndex(DatabaseHelper.TRANSACTION_NAME));
returnListValue.itemCat = cursor.getString(cursor.getColumnIndex(DatabaseHelper.TRANSACTION_CATEGORY));
returnListValue.itemCurrency = cursor.getString(cursor.getColumnIndex(DatabaseHelper.TRANSACTION_CURRENCY));
returnListValue.itemPrice = cursor.getString(cursor.getColumnIndex(DatabaseHelper.TRANSACTION_PRICE));
returnListValue.date = cursor.getString(cursor.getColumnIndex(DatabaseHelper.TRANSACTION_DATE));
adapterData.add(returnListValue);
}
}
}
@Override
public void transactionLoadComplete(Cursor cursor) {
convertCursorToTransactionInfoList(cursor);
adapter.setData(adapterData);
adapter.notifyDataSetChanged();
adapter.transactionData.notifyAll();
}
}
AdapterTransactions.java:
public class AdapterTransactions extends RecyclerView.Adapter<AdapterTransactions.MyViewHolder> {
private LayoutInflater inflater;
List<TransactionInfo> transactionData = Collections.emptyList();
public void setData(List<TransactionInfo> newData) {
transactionData = newData;
}
public AdapterTransactions(Context context, List<TransactionInfo> transactionData) {
inflater = LayoutInflater.from(context);
this.transactionData = transactionData;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.transaction_row, parent, false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
TransactionInfo current = transactionData.get(position);
holder.itemName.setText(current.itemName);
holder.itemCat.setText(current.itemCat);
holder.itemPrice.setText(current.itemPrice);
holder.itemDate.setText(current.date);
holder.itemCurrency.setText(current.itemCurrency);
}
@Override
public int getItemCount() {
return transactionData.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView itemName, itemCat, itemPrice, itemDate, itemCurrency;
public MyViewHolder(View itemView) {
super(itemView);
itemName = (TextView) itemView.findViewById(R.id.itemName);
itemCat = (TextView) itemView.findViewById(R.id.itemCat);
itemPrice = (TextView) itemView.findViewById(R.id.itemPrice);
itemDate = (TextView) itemView.findViewById(R.id.itemDate);
itemCurrency = (TextView) itemView.findViewById(R.id.itemCurrency);
}
}
}
TransactionInfo.java:
public class TransactionInfo {
public String itemName, itemPrice, itemCurrency, itemCat, date;
}
重新回答:
我已尝试对convertCursorToTransactionInfoList 进行以下方法更改:
private void convertCursorToTransactionInfoList(Cursor cursor) {
if (cursor != null) {
while (cursor.moveToNext()) {
TransactionInfo returnListValue = new TransactionInfo();
returnListValue.itemName = cursor.getString(cursor.getColumnIndex(DatabaseHelper.TRANSACTION_NAME));
returnListValue.itemCat = cursor.getString(cursor.getColumnIndex(DatabaseHelper.TRANSACTION_CATEGORY));
returnListValue.itemCurrency = cursor.getString(cursor.getColumnIndex(DatabaseHelper.TRANSACTION_CURRENCY));
returnListValue.itemPrice = cursor.getString(cursor.getColumnIndex(DatabaseHelper.TRANSACTION_PRICE));
returnListValue.date = cursor.getString(cursor.getColumnIndex(DatabaseHelper.TRANSACTION_DATE));
adapterData.add(returnListValue);
}
}
}
和
private static void convertCursorToTransactionInfoList(Cursor cursor, ArrayList<TransactionInfo> adapterData) {
if (cursor != null) {
while (cursor.moveToNext()) {
TransactionInfo returnListValue = new TransactionInfo();
returnListValue.itemName = cursor.getString(cursor.getColumnIndex(DatabaseHelper.TRANSACTION_NAME));
returnListValue.itemCat = cursor.getString(cursor.getColumnIndex(DatabaseHelper.TRANSACTION_CATEGORY));
returnListValue.itemCurrency = cursor.getString(cursor.getColumnIndex(DatabaseHelper.TRANSACTION_CURRENCY));
returnListValue.itemPrice = cursor.getString(cursor.getColumnIndex(DatabaseHelper.TRANSACTION_PRICE));
returnListValue.date = cursor.getString(cursor.getColumnIndex(DatabaseHelper.TRANSACTION_DATE));
adapterData.add(returnListValue);
}
}
}
像这样通知adatpers:
@Override
public void transactionLoadComplete(Cursor cursor) {
convertCursorToTransactionInfoList(cursor, adapterData);
adapter.setData(adapterData);
adapter.notifyDataSetChanged();
adapter.transactionData.notifyAll();
}
另外,请注意,我必须将 List<TransactionInfo> adapterData = new ArrayList<>(); 更改为 ArrayList<TransactionInfo> adapterData = new ArrayList<>();
我看的越多,我就越认为它与ArrayList<> 或List<> 问题有关。
结束编辑
【问题讨论】:
-
它在哪里停止工作?您是否从数据库中获得结果?是否创建了未显示的视图?
-
片段只是空白;没有任何显示。如果这就是您获取结果的意思,那么数据库有必要的事务来加载。我不确定如何检查创建的视图。
-
使用调试或Log 类而不是发布整个应用代码...
-
哦,我明白你们的意思了。我已将 DDMS LogCat 添加到 OP。
标签: java android sqlite android-recyclerview