【问题标题】:Refresh fragment from adapter从适配器刷新片段
【发布时间】:2016-08-11 09:00:33
【问题描述】:

我的片段中有包含项目的 ListView。例如,每个项目都有计数器

项目 1 - 4 项目 2 - 5 在片段的顶部,我有 textView,其中包含所有元素的总和:sum - 9。我可以通过单击项目行上的图像来删除项目。在适配器 (getView()) 中是这样的:

final LinearLayout delete = (LinearLayout)dialog.findViewById(R.id.delete_layout);
                    delete.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            mParts.remove(part);
                            notifyDataSetChanged();
                            dialog.dismiss();
                    }
                });

该项目正在从列表中删除,但计数器没有更改值 - 例如,项目 2 已删除,但计数器仍显示 5。我在 onResume() 方法中更新它并且它有效,但前提是我离开片段并返回给它。我尝试在片段中编写更新方法并在适配器中使用它 - 我使用片段创建了构造函数:

public PartAdapter(Context context, int resource, List objects, InvActivity mActivity,InvFragment mFragment) {
        super(context, resource,objects);
        this.mParts = objects;
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.mActivity=mActivity;
        this.mFragment = mFragment;
    }

但是当我调用 fragment.something 时,我得到空点异常:/ 如何从适配器刷新片段/计数器 textView?我也尝试再次设置片段,但它不起作用。

我的适配器的一部分(很长)

public class PartAdapter extends ArrayAdapter {
    private OnUpdateListener listener;
    public interface OnUpdateListener {
        void onUpdate(String text);
    }

public void setOnUpdateListner(OnUpdateListener listener) {
    this.listener = listener;
}

private List<Part>mParts;
private LayoutInflater mInflater;
private TextView mPartName;
public CheckBox mState;
private ImageView mActionArrow;
public static final String TAG = PartAdapter.class.getSimpleName();
private static final int CAM_REQUEST  = 1313;
private InvActivity mActivity;
private AdapterCallback mAdapterCallback;
private TextView mCounter;
private ImageView mDelete;
private InvFragment mFragment;
public boolean shouldScan = true;

private final byte[] pal = new byte[]{
        (byte) 0xDA, (byte) 0xAD,  // const
        (byte) 0x04, (byte) 0x74, (byte) 0x31, // com
        (byte) 0xe7, (byte) 0x64 //last

};
private final byte[] readId = new byte[]{
        (byte) 0xDA, (byte) 0xAD,  // const
        (byte) 0x04, (byte) 0x6f, (byte) 0x69, // com
        (byte) 0xec, (byte) 0x6e //last


};
private UsbManager usbManager;
private UsbDevice device;
public List<String> codes;




public PartAdapter(Context context, int resource, List objects, InvActivity mActivity,AdapterCallback callback) {
    super(context, resource,objects);
    this.mParts = objects;
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.mActivity=mActivity;
    this.mAdapterCallback = callback;
}
public PartAdapter(Context context, int resource, List objects, InvActivity mActivity,InvFragment mFragment) {
    super(context, resource,objects);
    this.mParts = objects;
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.mActivity=mActivity;
    this.mFragment = mFragment;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    if(convertView == null)
        convertView=mInflater.inflate(R.layout.part_item,parent,false);
    mState = (CheckBox) convertView.findViewById(R.id.state_chb);
    mDelete = (ImageView)convertView.findViewById(R.id.delete_car);
    mDelete.setVisibility(View.INVISIBLE);


    final Part party = mParts.get(position);
    if(party.isScan() || party.getType().contentEquals("2")) {
        mState.setChecked(true);
    } else if (!party.isScan()){
        mState.setChecked(false);
    }
    if(party.getType().contentEquals("2"))
        mDelete.setVisibility(View.VISIBLE);


    if(mParts.get(position).getClass().isInstance(new Part())) {
        final Part part = (Part) mParts.get(position);
        mPartName = (TextView)convertView.findViewById(R.id.car_name_tv);
        mState = (CheckBox) convertView.findViewById(R.id.state_chb);
        mPartName.setText(part.getName());
        mActionArrow = (ImageView)convertView.findViewById(R.id.arrow_action);
        mCounter = (TextView)convertView.findViewById(R.id.car_count_tv);
        mCounter.setText(part.getQuantity());
        if(!part.isScan()) {
            mState.setChecked(false);
        } else if(part.isScan() || part.getType().contentEquals("2")) {
            mState.setChecked(true);
        }

        mActionArrow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                final Dialog dialog = new Dialog(getContext());
                dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

                dialog.setContentView(R.layout.dialog_context_menu);

                final LinearLayout delete = (LinearLayout)dialog.findViewById(R.id.delete_layout);
                delete.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        int totalSum = 5;
                        int partValue = 2;
                        mParts.remove(part);
                        notifyDataSetChanged();
                        dialog.dismiss();
                        if(listener != null){
                            listener((totalSum - partValue).toString());
                        }

                    }
                });
                LinearLayout photo = (LinearLayout)dialog.findViewById(R.id.photo_layout);
                photo.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mActivity.dispatchTakePictureIntent();

                    }
                });
                LinearLayout note = (LinearLayout)dialog.findViewById(R.id.note_layout);
                note.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        dialog.dismiss();
                        final Dialog noteDialog = new Dialog(getContext());
                        noteDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                        noteDialog.setContentView(R.layout.dialog_note);
                        final EditText noteET = (EditText)noteDialog.findViewById(R.id.note_et);
                        if(!part.getNote().contentEquals("null"))
                            noteET.setText(part.getNote());
                        Button save = (Button)noteDialog.findViewById(R.id.save_button);
                        save.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                part.setNote(noteET.getText().toString());
                                noteDialog.dismiss();
                            }
                        });
                        noteDialog.show();
                        Button cancel = (Button) noteDialog.findViewById(R.id.cancel_button);
                        cancel.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                noteDialog.dismiss();
                            }
                        });

                    }
                });

                LinearLayout values = (LinearLayout)dialog.findViewById(R.id.values_layout);
                values.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        final Dialog noteDialog = new Dialog(getContext());
                        noteDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                        noteDialog.setContentView(R.layout.dialog_note);
                        final EditText noteET = (EditText)noteDialog.findViewById(R.id.note_et);
                        noteET.setInputType(InputType.TYPE_CLASS_NUMBER);
                        Button save = (Button)noteDialog.findViewById(R.id.save_button);
                        save.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                part.setQuantity(noteET.getText().toString());
                                noteDialog.dismiss();
                                dialog.dismiss();
                            }
                        });
                        noteDialog.show();
                        Button cancel = (Button) noteDialog.findViewById(R.id.cancel_button);
                        cancel.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                noteDialog.dismiss();
                                dialog.dismiss();
                            }
                        });
                    }
                });

                dialog.show();
            }
        });

    }


    return convertView;
}

从我的活动中:

public void onUpdate(String value){
        mCountTV.setText(value);
    }

private void createAdapter() {
    adapter.setOnUpdateListner(this);
}

}

【问题讨论】:

  • 尝试在适配器中添加接口而不是在片段中捕获删除回调并更新文本视图

标签: android adapter


【解决方案1】:

您可以按照以下流程进行操作。

在您的 PartAdapter 中设置一个侦听器,该侦听器将在 Fragment 中实现,用于更新 sum 文本视图的值。

class PartAdapter {
    private OnUpdateLitener listener;

    public interface OnUpdateListener {
        void onUpdate(String text);
    }

    public void setOnUpdateListner(OnUpdateListener listener) {
        this.listener = listener;
    }

    // in your getView() method
    final LinearLayout delete = (LinearLayout)dialog.findViewById(R.id.delete_layout);
                delete.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mParts.remove(part);
                        notifyDataSetChanged();
                        if(listener != null){
                            listener.onUpdate(String.valueOf(totalSum - partValue));
                        }
                        dialog.dismiss();
                }
            });
}

在你的片段中

class MyFragment {

    private OnUpdateListener listener; 

    void onAttach(Activity activity){
        if(!(activity instaceof PartAdapter.OnUpdateListener)){
            throw new IllegalStateException("Must implement OnUpdateListener");
        }
        listener = (PartAdapter.OnUpdateListener) activity;

    }

    private void createAdapter() {
        PartAdapter adapter = new PartAdapter(getContext(), R.layout.part_item, mParts, mActivity, new AdapterCallback() {
            @Override
                public void onMethodCallback() {
                    Log.e(TAG, "onMethodCallback: ");
                }
            });
            adapter.setOnUpdateListener(this);
            mPartsLV.setAdapter(adapter);
    }
}

在你的活动中

class MainActivity implements PartAdapter.OnUpdateListener {

    public void onUpdate(String value){
            textView.setText(value);
    }
}

【讨论】:

  • 它不起作用。我完全按照你的描述做了,但在片段中没有回应:/
  • 分享你刚刚尝试过的片段和适配器类。
  • 我编辑了我的帖子。问题也出在行 listener((totalSum - partValue).toString()); - toString 被标记为无法解析。我设置为默认值的 totalSum 和 partValue 以检查它是否有效:)
  • 你的文本视图在哪里显示总和?在活动中还是在片段中?你是如何设置onUpdateListenerPartAdapter 的?
  • 活动中。我有 asynctask 从 API 下载所有项目,然后检查计数器,总结并显示。另外,我检查“onResume() 中现有项目的计数器。
猜你喜欢
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多