当前位置: 首页 > 知识库问答 >
问题:

领域中的ArrayIndexOutOfBoundException

樊博雅
2023-03-14
public class ExpenseAdapter extends RealmRecyclerViewAdapater<Expense> {

final Context context;
private Realm realm;
private LayoutInflater inflater;

public ExpenseAdapter(Context context) {
    this.context = context;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // inflate a new card view
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.expense_recycler_view, parent, false);
    // view.setOnCreateContextMenuListener(this);
    return new CardViewHolder(view);
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) {

    realm = RealmController.getInstance().getRealm();

    final Expense expense = getItem(position);
    final Tour tour = new Tour();
    final CardViewHolder holder = (CardViewHolder) viewHolder;
    String s = "";

    RealmResults<Tour> r = realm.where(Tour.class).findAll();
    realm.beginTransaction();
    s = r.get(position).getEventId();
    realm.commitTransaction();


    holder.textExpense.setText(expense.getAmount() + " E: " + expense.getEventId());
    holder.textDescription.setText(expense.getDescription() + " T: " + s);

    holder.card.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View content = inflater.inflate(R.layout.activity_add_new_expense, null);
            final EditText editAmount = (EditText) content.findViewById(R.id.edtxt_expense);
            final EditText editDescription = (EditText) content.findViewById(R.id.edtxt_description);

            editAmount.setText(expense.getAmount());
            editDescription.setText(expense.getDescription());

            AlertDialog.Builder builder = new AlertDialog.Builder(context);
            builder.setView(content)
                    .setTitle("Edit Event")
                    .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {

                            RealmResults<Expense> results = realm.where(Expense.class).findAll();

                            realm.beginTransaction();
                            results.get(position).setAmount(editAmount.getText().toString());
                            results.get(position).setDescription(editDescription.getText().toString());

                            realm.commitTransaction();

                            notifyDataSetChanged();
                        }
                    })
                    .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    });
            AlertDialog dialog = builder.create();
            dialog.show();
        }
    });

}

@Override
public int getItemCount() {
    if (getRealmAdapter() != null) {
        return getRealmAdapter().getCount();
    }
    return 0;
}

public static class CardViewHolder extends RecyclerView.ViewHolder {

    public CardView card;
    public TextView textExpense;
    public TextView textDescription;

    public CardViewHolder(View itemView) {
        // standard view holder pattern with Butterknife view injection
        super(itemView);

        card = (CardView) itemView.findViewById(R.id.card_expense);
        textExpense = (TextView) itemView.findViewById(R.id.text_amount);
        textDescription = (TextView) itemView.findViewById(R.id.text_description);
    }

}
}

提前致谢!!!

共有1个答案

艾焕
2023-03-14

这就是为什么:

RealmResults<Expense> results = realm.where(Expense.class).findAll();
realm.beginTransaction();
results.get(position).setAmount(editAmount.getText().toString());
results.get(position).setDescription(editDescription.getText().toString());
realm.commitTransaction();
notifyDataSetChanged(); // <--------- this causes the crash

问题:

1.)如果您在事务中操作结果集,那么您应该在事务中执行查询

realm.beginTransaction();
RealmResults<Expense> results = realm.where(Expense.class).findAll();
Expense expense = results.get(position);
expense.setAmount(editAmount.getText().toString());
expense.setDescription(editDescription.getText().toString());

那个指南是过时的垃圾,我推荐使用我的:

如何像一个冠军一样使用Android领域,以及如何判断自己是否做错了

以及相应的源示例。

 类似资料:
  • 3.6 ABP领域层 - 领域事件 在C#中,一个类可以定义其专属的事件并且其它类可以注册该事件并监听,当事件被触发时可以获得事件通知。这对于对于桌面应用程序或独立的Windows Service来说非常有用。但是, 对于Web应用程序来说会有点问题,因为对象是根据请求(request)被创建并且它们的生命周期都很短暂。我们很难注册其它类别的事件。同样地,直接注册其它类别的事件也造成了类之间的耦合

  • 3.4 ABP领域层 - 领域服务 3.4.1 简介 领域服务(或者服务,在DDD模式中)是被用来执行领域操作或者业务规则的。Eric Evans 在他的DDD书中这样说过:一个好的Service应该有以下三个特征: 与领域概念相关的操作不是Entity或Value Object 的一个自然部分; 接口是根据领域模型的其它元素定义的; 操作是无状态的。 领域服务和Application Servi

  • 问题内容: 我正在尝试在Realm中使用Optional Int,并且出现了我认为的旧错误。 码 错误 我正在将Realm 0.96.1与XCode 7.1一起使用 我的境界文档中了解它说,不支持作为,但https://twitter.com/realm/status/656621989583548416。那是来自Realm Twitter的,这就是为什么我感到困惑。被支持还是仍然没有? 问题答案

  • DDD DSL DSL(domain-specific languages)即领域特定语言,唯一能够确定DSL边界的方法是考虑“一门语言的一种特定用法”和“该语言的设计者或使用者的意图。在试图设计一个DSL的时候,发现了一些有意思的简单的示例。 DSL示例 jQuery 最流行的DSL jQuery是一个Internal DSL的典型的例子。它是在一门现成语言内实现针对领域问题的描述。 $('.m

  • 如何使用嵌入式iframe方法解决跨域问题?意思是我有域A和域B,并想在域B上嵌入域A,以绕过同源策略?一个详细的例子将是伟大的!

  • 但是,每次尝试验证时都会出现以下错误: 严重:执行身份验证时出现异常com.microsoft.sqlserver.jdbc.sqlserverexception:关键字“null”附近的语法不正确。在com.microsoft.sqlserver.jdbc.sqlserverexception.makefromdatabaseError(sqlserverexception.java:258)在