【问题标题】:Update Listview in Fragment , based on activity result . No result found anywhere根据活动结果更新 Fragment 中的 Listview。在任何地方都找不到结果
【发布时间】:2016-02-08 05:31:14
【问题描述】:

我有一个活动和一个片段 在我的活动中,我的操作栏中有按钮,单击按钮会弹出一个对话框,因为我有一个列表视图。 如果我从该列表中选择任何项目,则该数据将进入片段,并根据来自活动的该数据显示我的片段列表视图

例如如果我选择 Technology , technology id =1 应该传入我的查询参数,并基于此我的片段列表视图应该出现。 每次我从列表中选择不同的项目时,我的片段列表视图都应该更新。

但我的问题是我没有得到片段中的任何数据,而且我的列表没有得到更新

Mainactivity.java

 @Override
        public boolean onPrepareOptionsMenu(Menu menu) {
            MenuItem actionViewItem = menu.findItem(R.id.miActionButton);
            // Retrieve the action-view from menu
            View v = MenuItemCompat.getActionView(actionViewItem);
            // Find the button within action-view
            Button b = (Button) v.findViewById(R.id.btnCustomAction);
            // Handle button click here

            b.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    showDialog(CUSTOM_DIALOG_ID);
                }
            });
            return super.onPrepareOptionsMenu(menu);
        }

        @Override
        public Dialog onCreateDialog(int id) {

            Dialog dialog = null;

            switch (id) {
            case CUSTOM_DIALOG_ID:
                dialog = new Dialog(this);
                dialog.setContentView(R.layout.dialoglayout);
                dialog.setTitle("Select Category");

                dialog.setCancelable(true);
                dialog.setCanceledOnTouchOutside(true);

                dialog.setOnCancelListener(new OnCancelListener() {

                    @Override
                    public void onCancel(DialogInterface dialog) {

                    }
                });

                dialog.setOnDismissListener(new OnDismissListener() {

                    @Override
                    public void onDismiss(DialogInterface dialog) {
                        // TODO Auto-generated method stub

                    }
                });

                // Prepare ListView in dialog
                dialog_ListView = (ListView) dialog.findViewById(R.id.dialoglist);
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                        android.R.layout.simple_list_item_1, listContent);
                dialog_ListView.setAdapter(adapter);
                dialog_ListView.setOnItemClickListener(new OnItemClickListener() {

                    @Override
                    public void onItemClick(AdapterView<?> parent, View view,
                            int position, long id) {
                        // TODO Auto-generated method stub

                        // i = (int) parent.getItemIdAtPosition(position);

                        category_name = (String) parent.getItemAtPosition(position);

                        Log.d("category name", category_name);


                        if(category_name.equals("a"))
                        {
                            cat_id=1;

                        }
                        if(category_name.equals("b"))
                        {
                            cat_id=2;
                        }
                        if(category_name.equals("c"))
                        {
                            cat_id=3;
                        }
                        if(category_name.equals("d"))
                        {
                            cat_id=4;
                        }
                        if(category_name.equals("e"))
                        {
                            cat_id=5;
                        }
                        if(category_name.equals("f"))
                        {
                            cat_id=6;
                        }

                         Log.d("id",""+cat_id);

                        dismissDialog(CUSTOM_DIALOG_ID);
                    }

                });

                break;
            }

            return dialog;
        }


    public int getMyData() {
            return cat_id;
        }

片段.java:

 public String param;
        public String url;
        public int cat_id;


        Mainactivity activity = (Mainactivity) getActivity();
            int myDataFromActivity = activity.getMyData();

            cat_id = myDataFromActivity;
            Log.d("Category_id", "" + cat_id);


            Map<String, String> map1 = new HashMap<String, String>();
                param = "?cat_id=" + cat_id;

                //URL is fake , original url is working fine.
                url = "http://www.abbcd.com/xyz/webservices/data/getAllData.php"
                        + param;

                map1.put("url", url);

                new MultiPartRequester(mainActivity, map1,
                        NetUtils.RequestCode.GET_ALL_DATA,
                        this).execute();

更新部分:

@Override
    public void updateFragmentList(int catId) {
        // TODO Auto-generated method stub

        param = "?cat_id=" + catId;

        url = "http://www.abbcd.com/xyz/webservices/data/getAllData.php"+ param;

        Map<String, String> map1 = new HashMap<String, String>();
        map1.put("url", url);

        new MultiPartRequester(mainActivity, map1,
                NetUtils.GET_DATA, this)
                .execute();
    }

【问题讨论】:

  • Fragment传递数据的代码在哪里?
  • public int getMyData() { return cat_id; }
  • 您在哪个函数中调用这些行? Mainactivity activity = (Mainactivity) getActivity(); int myDataFromActivity = activity.getMyData();

标签: android listview android-fragments dialog android-actionbar


【解决方案1】:

ActivityFragment 之间通信的好方法是Listeners。当您要更新片段时,请使用侦听器并更新片段。在MainActivity中创建接口

听众

public interface FragmentListener {
        void updateFragmentList(int catId);
}

Fragment中实现为

public class MyFragment extends Fragment implements MainActivity.FragmentListener

然后在onActivityCreated的片段中

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        ((MainActivity) getActivity()).setFragmentListener(this);
}

MainActivity

public void setFragmentListener(FragmentListener listener)
    {

            this.fragmentListener = listener;

    }

public void sendDataToFragment(int catId) {
      this.fragmentListener.updateFragmentList(catId);
}

希望这会有所帮助。

更新

使用this.fragmentListener.updateFragmentList(catId);向fragment发送数据,在Fragment中创建方法为``

public void updateFragmentList(int catId){
       //Here update your listview with cat id
}

【讨论】:

  • this.fragmentListener 是什么;
  • 以及如何将 cat_id 从活动传递到 fragment.means 数据?
  • MainActivity中创建全局变量为FragmentListener fragmentListener
  • 选择对话框项时调用MainActivity函数sendDataToFragment()
  • 如何获取片段中的数据?
【解决方案2】:

在活动中使用静态全局变量

public static int cat_id = 0;

在下面的片段中访问cat_id

 Map<String, String> map1 = new HashMap<String, String>();
                param = "?cat_id=" + activity.cat_id;

或在您的 getMyData 方法中进行以下更改

public int getMyData() { 
return cat_id; 
}

已编辑:

另一种方法终于奏效了,从活动中调用您的片段方法并在方法中传递cat_id使用你的片段名称代替ExampleFragment

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
fragment.mymethod(cat_id);

【讨论】:

  • static global 变量不是一个好方法,我们应该避免使用不必要的 static 变量。此外,这不会解决 OP 的问题。
  • 再一次,我们不应该使用除非和 util 有强烈的需求,因为多线程会产生问题。
  • 我在对话框 getMyData() 中使用它,但数据没有通过
  • 我刚刚给出了例子,我的意思是在这里提供好的和最佳的解决方案。
  • 我想将列表项数据从活动传递到片段,然后我想更新我的列表
猜你喜欢
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
相关资源
最近更新 更多