首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RecylerView不会

RecylerView不会
EN

Stack Overflow用户
提问于 2015-11-30 21:36:04
回答 2查看 102关注 0票数 0

调试后更新

事实证明,convertCursorToTransactionInfoListtransactionLoadComplete从未真正运行过。我在它们上加了断点,它们从未出现在调试器中。此外,adapterData: size = 0在运行调试器时显示。

我能够正确地填充回收商视图中的一项内容,使用onCreateView中的TransactionInfo returnListValue = new TransactionInfo();代码。

有人能提供一些洞察为什么这将不起作用吗?我这么做的次数越多,我就认为这与ArrayList<>List<>之间的关系有关,因为ArrayList<>TransactionsTab.java中使用,而在AdapterTransactions.java中,List<>在某些方面被使用或TransactionInfo.java。我把这些课都贴在下面了。

SQLite接口不是问题(我很确定),因为我在应用程序的其他地方使用它来使用SimpleCursorAdapter填充Spinners

TransactionsTab.java:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
public class TransactionInfo {
public String itemName, itemPrice, itemCurrency, itemCat, date;
}

RE答案:

我尝试过对convertCursorToTransactionInfoList进行以下方法的修改

代码语言:javascript
运行
复制
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);
        }
    }
}

代码语言:javascript
运行
复制
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);
        }
    }
}

通知这样的广告客户:

代码语言:javascript
运行
复制
@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<>问题有关。

端编辑

EN

回答 2

Stack Overflow用户

发布于 2015-12-01 03:26:35

问题在于从Cursor中获取数据,特别是在这里:

代码语言:javascript
运行
复制
if (cursor.moveToFirst()) {
    for (int i = 10; i < cursor.getCount(); i++) {
        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));
        returnList.add(returnListValue);
    }
}

上面的代码将游标移动到第一个位置(cursor.moveToFirst()),但在此之后,Cursor位置不会改变,因此循环被执行cursor.getCount()次,但它只对游标中的第一个项进行操作。

相反,我会选择while循环而不是for循环,如下所示:

代码语言:javascript
运行
复制
// move cursor on to next position if available
while(cursor.moveToNext()) { 
    // More data is available so add it to the list
    // process data as before
}

编辑1

RE your comment -以下是我建议的改变。

而不是:

代码语言:javascript
运行
复制
adapterData = convertCursorToBudgetInfoList(cursor);

以下任一项:

备选案文1

convertCursorToBudgetInfoList仍然是一个static方法,但现在对原始adapterData引用进行操作。

代码语言:javascript
运行
复制
convertCursorToBudgetInfoList(cursor, adapterData);

并将方法更改为:

代码语言:javascript
运行
复制
private static void convertCursorToBudgetInfoList(Cursor cursor, ArrayList<TransactionInfo> adapterData) {

    if (cursor != null) {                         

        while (cursor.moveToNext()) { // note: no for loop ;-)
            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);
        }
    }
}

选项2

使convertCursorToBudgetInfoList成为一个成员方法而不是静态方法,并直接对adapterData进行操作。

代码语言:javascript
运行
复制
convertCursorToBudgetInfoList(cursor);

并将方法更改为:

代码语言:javascript
运行
复制
private void convertCursorToBudgetInfoList(Cursor cursor) {

    if (cursor != null) {                         

        while (cursor.moveToNext()) { // note: no for loop ;-)
            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); // member variable (same as this.adapterData)
        }
    }
}

当然,使用这两个选项中的任何一个都要确保通知适配器。

我还要重申,您确实需要使用调试器来摆脱for循环步骤,一切都会变得清晰起来。

票数 2
EN

Stack Overflow用户

发布于 2015-12-01 00:04:07

尝试在for中更改此convertCursorToBudgetInfoList循环

代码语言:javascript
运行
复制
for (int i = 10; i < cursor.getCount(); i++) 

0开始..。如果有不到10个结果,什么都不会出现!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34008455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档