【问题标题】:Getting data from ListView in DialogFragment using onItemClick使用 onItemClick 从 DialogFragment 中的 ListView 获取数据
【发布时间】:2017-03-09 16:04:46
【问题描述】:

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

是否可以将所选项目的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");
            }
        });

我的包含 ListView 的 DialogFragment 类:

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;

    }


}

【问题讨论】:

  • 就像FragmentDialogFragment 可以通过托管Activity 使用接口进行通信 - 创建一个接口并在您的Activity 中实现回调,然后在您的Activity 中通过以下方式找到片段它的idtag 并直接调用传递值的方法。还有其他方法,例如 RxJava,但是这是使用托管 Activitys 在Fragments 之间进行通信的常用方法@

标签: android listview fragment onitemclicklistener dialogfragment


【解决方案1】:

先创建一个接口

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

interface 创建设置器

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);
   }

【讨论】:

  • 感谢您的回复!您能否澄清一下您所指的“资源 ID”是什么?
  • 这将是您在单击列表项时返回的可绘制资源 ID。即R.drawable.bumbas_mask
  • 非常感谢向导!我终于让代码工作了,所以我可以完成我的应用程序。没有你的帮助是不可能做到的
  • 很高兴为您提供帮助。如果有人的回答对你有帮助,别忘了点赞。如果答案正确,您也可以接受。
【解决方案2】:

这个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);

【讨论】:

    【解决方案3】:

    你可以声明一个接口

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多