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

Android:从适配器获取信息

凌俊语
2023-03-14

我有一个连接到CustomAdapter的ListView。在Adapter类中,我有不同视图的侦听器。当某些事情发生变化时,它会更新ListItem的值

currentItem.myListItemMethod()

现在我不知道如何将这些信息返回到包含ListView的片段中。我试过了

adapter.registerDataSetObserver

但它不会对适配器内的任何更改作出反应。仅限于片段本身的更改(如单击添加新项的按钮)。

我还想知道如何获取适配器类中最新ArrayList的引用,以便将其返回到片段。

我希望我的问题是可以理解的,我是编程新手。

编辑:

这里我的片段与ListView

public class SettingsWindow extends Fragment {

    private ArrayList<IncentiveItem> mIncentiveList;

    private OnFragmentInteractionListener mListener;

    ListView incentiveList;

    IncentiveAdapter adapter;

    public SettingsWindow() {
        // Required empty public constructor
    }


    public static SettingsWindow newInstance(ArrayList<IncentiveItem> incentiveList) {
        SettingsWindow fragment = new SettingsWindow();
        Bundle args = new Bundle();
        args.putSerializable("Incentive List", incentiveList);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mIncentiveList = (ArrayList<IncentiveItem>) getArguments().getSerializable("Incentive List");
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View inf = inflater.inflate(R.layout.fragment_settings_window, container, false);
        incentiveList = (ListView) inf.findViewById(R.id.incentive_list_xml);

        adapter = new IncentiveAdapter(getActivity(), mIncentiveList);

        incentiveList.setAdapter(adapter);

        return inf;
    }



    // TODO: Rename method, update argument and hook method into UI event
    public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
            mListener = (OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    /**
     * This interface must be implemented by activities that contain this
     * fragment to allow an interaction in this fragment to be communicated
     * to the activity and potentially other fragments contained in that
     * activity.
     * <p>
     * See the Android Training lesson <a href=
     * "http://developer.android.com/training/basics/fragments/communicating.html"
     * >Communicating with Other Fragments</a> for more information.
     */
    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        void onFragmentInteraction(Uri uri);
    }

    public void addIncentive() {
        mIncentiveList.add(new IncentiveItem());
        adapter.notifyDataSetChanged();
    }

}

这是适配器

public class IncentiveAdapter extends ArrayAdapter<IncentiveItem> {


    public IncentiveAdapter(Activity context, ArrayList<IncentiveItem> incentiveList) {
        super(context, 0, incentiveList);
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        View listItemView = convertView;
        if (listItemView == null) {
            listItemView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false);
        }

        final IncentiveItem currentItem = getItem(position);

        //We get references for the Views within the Incentive Item
        final ImageView star = (ImageView) listItemView.findViewById(R.id.star_xml);
        final EditText description = (EditText) listItemView.findViewById(R.id.incentive_text_xml);
        SeekBar seekBar = (SeekBar) listItemView.findViewById(R.id.seekbar_xml);
        final TextView percentage = (TextView) listItemView.findViewById(R.id.seekbar_percentage_xml);

        star.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (currentItem.getActiveOrInactive() == false) {
                    currentItem.setActive();
                    star.setImageResource(R.drawable.ic_star_active);
                } else {
                    currentItem.setInActive();
                    star.setImageResource(R.drawable.ic_star_inactive);;
                }
            }
        });

        description.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                currentItem.setText(description.getText().toString());
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });

        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {
                percentage.setText("" + progress + "%");
                currentItem.setProbabilityInPercent(progress);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });

        return listItemView;
    }

}

共有1个答案

程鸿畅
2023-03-14

您可以在Adapter类中创建一个接口,您可以在片段中实现该接口并将其设置为Adapter,以便在适配器中发生任何更改时可以通知片段。

此外,我想知道如何在Adapter类中获得对最新ArrayList的引用,以便我可以将其返回到片段

为此,我们可以使用默认方法

因此,在适配器类中创建这样的方法,您可以获得完整的列表

public ArrayList<IncentiveItem> getItemValues() {
    ArrayList<IncentiveItem> incentiveList  = new ArrayList<IncentiveItem>();
    for (int i=0 ; i < getCount() ; i++){
        IncentiveItem incentiveItem = getItem(i);
        incentiveList.add(incentiveItem);
    }
    return incentiveList;
}

已编辑在适配器类中创建一个这样的接口

public interface OnAdapterItemActionListener {
    public void onStarItemClicked(int position);
    public void onSeekBarChage(int position, int progress);
    //.. and you can add more method like this
}

在适配器的构造函数中添加此接口,并将该对象保存在适配器中

public class IncentiveAdapter extends ArrayAdapter<IncentiveItem> {

    private OnAdapterItemActionListener mListener;
    public IncentiveAdapter(Activity context, ArrayList<IncentiveItem> incentiveList, OnAdapterItemActionListener listener) {
        super(context, 0, incentiveList);
        mListener = listener;
    }
}

现在在您的片段中,您应该像下面这样实现这个接口

public class SettingsWindow extends Fragment implements OnAdapterItemActionListener{
    @Overrride
    public void onStarItemClicked(int position) {
        // You will get callback here when click in adapter
    }

    @Overrride
    public void onSeekBarChage(int position, int progress) {
        // You will get callback here when seekbar changed
    }
}

在创建适配器对象时,您也应该发送接口实现,因为在适配器构造函数中,我们希望这样,所以请更改此选项,

adapter = new IncentiveAdapter(getActivity(), mIncentiveList, this); // this - Because we implemented in this class

上面的代码将完成接口设置,现在我们应该在正确的时间触发接口,如下所示,

当用户点击星号按钮时,我们应该这样触发,

star.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Your code here
                if(mListener != null) { //Just for safety check
                    mListener.onStarItemClicked(position);// this will send the callback to your Fragment implementation
                }
            }
        });
 类似资料:
  • 在旧代码中,当我使用与自定义适配器时,我可以使用此代码获取项目。 现在我正在实现。如何从<代码>回收视图中获取项目。适配器?

  • AdapterClass: 提前感谢你的帮助。

  • 本节将会引入一个全新的概念——适配器,这个名字很形象,和电源适配器的功能类似,从程序设计的角度出发,它可以将不同类型、不同结构的数据适配到一起。 在 Android 中,适配器是 UI 组件和数据之间的桥梁,它帮助我们将数据填充到 UI 组件当中,实现了一个典型的 MVC 模式。我们可以分别编写独立的 UI 样式和数据模型,至于数据如何与 UI 组件绑定都由 Adapter 帮我们完成,这样的好处

  • 我已经为android adapter view上的read onclick项编写了一个代码, 我正在传递它正在使用的信息 在我的第二个类页面上显示如下输出: {描述=关于选定的描述,标题=选定的标题} 我只想知道如何分别显示描述和标题。 如: 所选标题(显示在一个文本视图上)关于所选内容的说明(显示在另一个文本视图上) 第一类 ------------ public void onItemCli

  • 无法通过运行以下命令获取项目: 正如您在下面的输出项中所看到的,是一个空数组: 但是,我在prometheus终结点中获取了正确的数据:prometheus URL:http:// :9090/API/V1/Series?匹配%5b%5d=%7b__name__%3d~%22%5erabbitmq_queue_.%2a%22%7d&start=1597255421.51响应: 我使用以下helm值

  • 我正在使用选项卡布局。我正在从live DB获取数据,以便在listview中显示信息。为此,我使用CustomAdapter。arraylist中正确获取的值。一旦将Arraylist数据传递给CustomAdapter,则上下文将出现null异常。如何将片段的上下文传递给自定义适配器。 自定义适配器构造函数 已编辑: 碎片 从片段中,我调用AsyncTask类从云获取数据。从postExecu