使用 onItemClick 从 DialogFragment 中的 ListView 获取数据

Getting data from ListView in DialogFragment using onItemClick

我目前有一个带有 ImageButton 的 Fragment,可以打开一个 DialogFragment。这个 DialogFragment 是一个使用适配器的自定义列表,其中每个条目都有一个 ImageView 和 TextView。

是否可以return选中项的ImageView的"src"到打开DialogFragment的Fragment?我需要将 ImageButton 的 src 更改为所选图像。

我调用 DialogFragment 的主要片段:

ImageButton starter = (ImageButton) myView.findViewById(R.id.imageStarterItem);

starter.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                //Here
                ItemPhysStarterFragment dialog = ItemPhysStarterFragment.newInstance();
                dialog.show(getFragmentManager(), "fragmentDialog");
            }
        });

我的 DialogFragment class 包含 ListView:

public class ItemPhysStarterFragment extends DialogFragment {

    Button btn;
    ListView lv;
    SearchView sv;
    ArrayAdapter<String> adapter;
    String[] names={"Bumba's Mask", "Rangda's Mask", "Bluestone Pendant", "Death's Toll",
                    "Mark of the Vanguard", "Swift Wing", "War Flag", "Watcher's Gift"};
    int[] images={R.drawable.bumbas_mask, R.drawable.rangdas_mask, R.drawable.bluestone_pendant, R.drawable.deaths_toll,
                    R.drawable.mark_of_the_vanguard, R.drawable.swift_wing, R.drawable.war_flag, R.drawable.watchers_gift};

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View myView=inflater.inflate(R.layout.item_list, null);

        //SET TITLE DIALOG TITLE
        getDialog().setTitle("Starter Items");

        //BUTTON,LISTVIEW,SEARCHVIEW INITIALIZATIONS
        lv=(ListView) myView.findViewById(R.id.listView1);
        sv=(SearchView) myView.findViewById(R.id.searchView1);
        btn=(Button) myView.findViewById(R.id.dismiss);

        //CREATE AND SET ADAPTER TO LISTVIEW
        final Adapter adapter = new Adapter(getActivity(), this.getItems());
        lv.setAdapter(adapter);

        //SEARCH
        sv.setQueryHint("Search starter items..");
        sv.setOnQueryTextListener(new OnQueryTextListener() {
            public boolean onQueryTextSubmit(String txt) {
                return false;
            }
            public boolean onQueryTextChange(String txt) {
                adapter.getFilter().filter(txt);
                return false;
            }
        });

        //BUTTON
        btn.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                dismiss();
            }
        });

        return myView;
    }

    public static ItemPhysStarterFragment newInstance(){
        ItemPhysStarterFragment f = new ItemPhysStarterFragment();
        return f;
    }

    private ArrayList<Item> getItems() {

        ArrayList<Item> items = new ArrayList<Item>();
        Item item;

        for(int i = 0; i < names.length; i++)
        {
            item = new Item(names[i], images[i]);
            items.add(item);
        }

        return items;

    }


}

你可以声明一个接口

public interface OnCustomItemClickListener {
    void onItemClicked(final String src);
}

并在创建对话框时实现该接口

(...),new OnCustomItemClickListener() {
                        @Override
                        public void onItemClicked() {
                        //do something
                        }
                    }, (...)

并在您的 ItemPhysStarterFragment 上适当地处理它 class

先创建一个接口

public interface OnListItemClickedListener {
    void onListItemClick(int resourceId);
}

interface

创建 setter
public class ItemPhysStarterFragment extends DialogFragment {
     OnListItemClickedListener mListener;

     public void setOnListItemSelectedListener(OnListItemClickedListener listener) {
         this.mListener = listener;
     }
}

现在将 Listener 设置为您的 fragment

ItemPhysStarterFragment dialog = ItemPhysStarterFragment.newInstance();
dialog.setOnListItemSelectedListener(new OnListItemClickedListener() {
            @Override
            public void onListItemClick(int resourceId) {
                // User your resourceId
            }
        });
dialog.show(getFragmentManager(), "fragmentDialog");

最后一步,在 ItemPhysStarterFragment 片段的 ListItemClick() 中触发侦听器 -

...public void onListItemClick(int resourceId) {
        mListener.onListItemClick(pass your resource id);
   }

这个 link 帮助我实现了@Wizzard 提出的相同结果。

基本上提出了相同的解决方案,只是不需要创建自定义界面。

  1. 在你的fragment class中创建一个变量和setter方法来接受OnItemClickListener

    private android.widget.AdapterView.OnItemClickListener onItemClickListener;
    

    public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) {
    this.onItemClickListener = onItemClickListener;
    }

  2. fragement class 中确保 listView 设置项目点击侦听器:

    list.setOnItemClickListener(onItemClickListener);

  3. 终于在你main class可以调用了listviewItemClickListener:

    DialogMyListFragment df = new DialogMyListFragment().getInstance();
    df.setOnItemClickListener(listener);