【问题标题】:Refreshing activity or listview after updating database更新数据库后刷新活动或列表视图
【发布时间】:2019-06-14 21:23:44
【问题描述】:

所以我有我的自定义 ArrayAdapter,其中定义了一个 getView 方法

@Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
        int orderId = getItem(position).getId();
        int menuId = getItem(position).getMenuId();
        int userId = getItem(position).getUserId();
        String status = getItem(position).getStatus();

        LayoutInflater inflater = LayoutInflater.from(activity);
        convertView = inflater.inflate(resource, parent, false);

        TextView idView = convertView.findViewById(R.id.order_id);
        TextView nameView = convertView.findViewById(R.id.item_name);
        TextView userIdView = convertView.findViewById(R.id.user_id);
        TextView statusView = convertView.findViewById(R.id.status_view);
        ImageButton cancelButton = convertView.findViewById(R.id.order_canceled);
        ImageButton orderDoneButton = convertView.findViewById(R.id.order_done);
        cancelButton.setTag(orderId);
        orderDoneButton.setTag(orderId);

        if(status.equals("done"))
            orderDoneButton.setImageResource(android.R.drawable.checkbox_on_background);
        else {
            orderDoneButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    orderRequest.getGenericRequest().setUri("/" + v.getTag() + "?status=done");
                    orderRequest.put();
//                ((ImageButton)v).setImageResource(android.R.drawable.checkbox_on_background);

                    notifyDataSetChanged();
                    // TODO cheating but it works
//                Intent intent = activity.getIntent();
//                intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
//                activity.startActivity(intent);
                }
            });
        }
  • 我的问题是,当我这样调用它并单击 OrderDoneButton 时,我的列表视图不会自行更新,即使我调用 notifyDataSetChanged() 并且我看到数据库已更新,我的问题是为什么?
  • 第二个问题是在这种方法中,注释掉了“Intent”,它以我想要的方式工作,但我不确定这是否是一个好方法,有什么建议吗?

【问题讨论】:

  • 您需要告诉我们getItem() 是什么以及您的数据在哪里,您可以在您的数据库更新 方法下方的活动或片段中调用notifyDataSetChanged() /跨度>
  • @IqbalRizky getItem() 是在 ArrayAdapter 中构建的方法,它允许您从传递给适配器的数组中获取项目。我的数据在数据库中(?)并显示在列表视图中。正如您在代码 sn-p 中看到的,我正在从适配器更新数据库,因此我想在单击列表视图项后从适配器更新我的视图/活动。

标签: android listview android-database


【解决方案1】:

这里有一些解释我通常做了什么

使用适配器设置视图

private ArrayAdapter<String> arrayAdapter;
private ArrayList<String> listPName = new ArrayList<>();
private void showBluetoothPrinters() {
    arrayAdapter = new ArrayAdapter<String>(mContext, android.R.layout.simple_list_item_1, listPName) {
        @NonNull
        @Override
        public View getView(int position, View convertView, @NotNull ViewGroup parent) {
            View view = super.getView(position, convertView, parent);
            TextView tv = view.findViewById(android.R.id.text1);
            tv.setPadding(padding * 3, 0, padding * 3, 0);
            return view;
        }
    };
    lvPrinter.setAdapter(arrayAdapter);
}

更新一些数据后调用 notifyDataSetChanged()

Set<BluetoothDevice> mPairedDevices = mBluetoothAdapter.getBondedDevices();
                if (mPairedDevices.size() > 0) {
                    for (BluetoothDevice mDevice : mPairedDevices) {
                        listPName.add(mDevice.getName());
                    }
                }
                if (arrayAdapter != null){
                    arrayAdapter.notifyDataSetChanged();
                }

不知道这是不是你所期望的

我在适配器中添加了一些 sn-p 调用 notifydatasetchage

@Override
public void onBindViewHolder(@NonNull VH holder, int position) {
    int amount = mListData.get(position);
    holder.tvAmount.setText(String.valueOf(amount));
    holder.tvText.setText(decimalFormat.format(amount));

    holder.itemView.setOnClickListener(v -> {
        if (mListener != null){
            mListener.onAmountTapped(amount);
        }
        tempSelected = position;
        notifyDataSetChanged();
    });
    if (position == tempSelected){
        holder.containerView.setBackground(mContext.getResources().getDrawable(R.drawable.rp_shadow_select));
    } else {
        holder.containerView.setBackground(mContext.getResources().getDrawable(R.drawable.rp_shadow));
    }
}

【讨论】:

  • 不,不是。因为你从活动中调用更新数据库,并且在这个地方你正在创建和持有 ArrayAdapter,这样你就可以调用 arrayadapter.notifyDataSetChanged(),我相信它可以工作。但是我在其中创建了 CustomArrayAdapter 我正在更新我的数据库并从那个地方我想通知我的视图/活动来更新自己。
  • 如果您想通知其他班级,请尝试 greenrobot event bushttps://github.com/greenrobot/EventBus
猜你喜欢
  • 2016-09-25
  • 2016-05-03
  • 2020-03-29
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多