【问题标题】:Back from Listwiew to MainActivity从 Listview 返回到 MainActivity
【发布时间】:2020-03-11 19:17:54
【问题描述】:

我从 Fragment 打开 ExpandableListView,它是从 MainActivity 打开的。

在 ListView 中,点击 Item 中的按钮会挂起一个监听器。

通过单击此按钮,我想将一些值传输到 MainActivity 并将其发送到 WebView。

片段用beginTransaction()打开并写入addToBackStack(null)

当我按下系统按钮的后退按钮时,一切正常,但我无法弄清楚在我的 ExpandableAdapter 类中如何打开 ExpandableListView 以为此片段调用 OnBackPress ....

现在我只需在 onClick 中调用 MainActivity 并通过 putExtra 传递值。但这每次都会重新启动我的 Main Activity,但我不需要它,因为它已经存在,我只需要返回它。

从 MainActivity 调用片段:

    Fragment fragmentWeb = new MainFragment();
    FragmentManager ft = getSupportFragmentManager();

    ft.beginTransaction().replace(R.id.mainlayout, fragmentWeb, dataFrag).addToBackStack(null).commit();

MainFragment 的一部分:

public class MainFragment extends Fragment implements OnBackPressed {
        ......

        getActivity().findViewById(R.id.list).setVisibility(ViewGroup.VISIBLE);
        expListView = (ExpandableListView) getActivity().findViewById(R.id.lvExp);
        new DownloadJason().execute();

        private class DownloadJason extends AsyncTask<Void, Void, Void> {
             // Get Json...
        }

    @Override
    protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            listAdapter = new myExpandableListAdapter(getActivity().getApplicationContext(), listHeader, listDataChild, listDataHeader, getActivity());

            expListView.setAdapter(listAdapter);

    }
}

myExpandableListAdapter 的一部分:

public class myExpandableListAdapter extends BaseExpandableListAdapter {
    private Activity _activity;
    private Context _context;
    private List<String> _listDataHeader; // header titles
    private List<Integer> imgHeader;
    private HashMap<String, List<String>> _listDataChild;
    private HashMap<String, List<String>> _listData;
    private Integer imgType1,imgType2,imgType3,imgType4,imgType5;
    private FragmentManager manager;

    public myExpandableListAdapter(Context context, List<String> listDataHeader,
                                   HashMap<String, List<String>> listChildData,
                                   HashMap<String, List<String>> listData,
                                   Activity activity) {
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listChildData;
        this._listData = listData;
        this._activity = activity;

    }

    ......

    @Override
    public View getChildView(final int groupPosition, final int childPosition,
                             boolean isLastChild, View convertView, ViewGroup parent) {

        final String childText = (String) getChild(groupPosition, childPosition);
        final String markerId = (String) getData(groupPosition, 0);

        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_item2, null);
        }

        TextView txtListChild = (TextView) convertView.findViewById(R.id.lblListItem);
        txtListChild.setText(childText);

        ImageButton btnMarker = (ImageButton) convertView.findViewById(R.id.imageButton);
        btnMarker.setImageResource(R.drawable.ic_place_black);


        btnMarker.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(_activity, MainActivity.class);
                intent.putExtra("markerId", markerId);
                _activity.startActivity(intent);
            }
        });

        return convertView;
    }

.....

}

【问题讨论】:

  • 使用 finish() 这是一个内置函数,可让您移动到应用中最新的上一个活动

标签: android android-fragments android-activity expandablelistview onbackpressed


【解决方案1】:

创建两个接口。

1.MainFragmentListener用于与activity/fragment通信

2.AdapterClickListener 用于与适配器/片段通信。

您必须像这样初始化为 MainFragmentListener

MainActivity implements MainFragmentListener{
..
}

在 MainFragment 创建 AdapterClickListener。 像这样。

MainFragmentListener mainFragmentListener = null;

然后将 MainFragmentListener 赋予片段。

Fragment fragmentWeb = new MainFragment();
fragmentWeb.adapterClickListener = this;

在 MainFragment 中创建 AdapterClickListener 和 在 onCreatedView() 中初始化 然后把这个接口给适配器。

主要片段

 AdapterClickListener AdapterClickListener = null;

适配器构造函数

public myExpandableListAdapter(Context context, List<String> listDataHeader,
                                   HashMap<String, List<String>> listChildData,
                                   HashMap<String, List<String>> listData,
                                   Activity activity,AdapterClickListener adapterClickListener) {
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listChildData;
        this._listData = listData;
        this._activity = activity;
        this.adapterClickListener = adapterClickListener;
    }

现在您可以通过界面将您想要的数据发送到主活动。

btnMarker.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                adapterClickListener.markerClicked(*****);
            }
        });

【讨论】:

    【解决方案2】:

    非常感谢@denizs !!!

    他的提示使我朝着正确的方向前进。但并非一切都适合我,例如,我不明白为什么:

    Fragment fragmentWeb = new MainFragment();
    fragmentWeb.adapterClickListener = this;
    

    但总的来说,他写的是真的,解决了我的问题。 我认为他的回答很详细,并将其标记为已接受。


    我在这里发布我的最终版本:

    创建界面: OnMarkerListener

    public interface OnMarkerListener{
        public void onMarkerRead(String marker);
    }
    

    MainActivity:

    public class MainActivity extends AppCompatActivity
            implements NavigationView.OnNavigationItemSelectedListener, OnMarkerListener {
    
    
    
        @Override
        public void onMarkerRead(String marker) {
            onBackPressed();
            inject(WebView, "openMarker(" + marker + ");", null);
        }
    
    }
    

    MainFragment:

        public class MainFragment extends Fragment implements OnBackPressed {
    
            OnMarkerListener markerListener;
            myExpandableListAdapter listAdapter;
            ....
    
            @Override
            public void onAttach(Context context){
                super.onAttach(context);
                Activity activity = (Activity) context;
                try {
                    markerListener = (OnMarkerListener) activity;
                }catch (ClassCastException e){
                    throw new ClassCastException(activity.toString()+ " must override onMarkerListener..");
                }
            }
    
    
           private class DownloadJason extends AsyncTask<Void, Void, Void> {
    
             ......
    
                @Override
                protected void onPostExecute(Void result) {
                    super.onPostExecute(result);
                    pDialog.dismiss();
    
                    //call constructor
                    listAdapter = new myExpandableListAdapter(getActivity().getApplicationContext(),
                         listHeader, listDataChild, listDataHeader, getActivity(), 
                         markerListener);
    
                    // setting list adapter
                    expListView.setAdapter(listAdapter);
    
           }
    
        }
    

    还有 myExpanableListAdapter:

    private OnMarkerListener _markerListener;
    
    public myExpandableListAdapter(Context context, List<String> listDataHeader,
                                   HashMap<String, List<String>> listChildData,
                                   HashMap<String, List<String>> listData,
                                   Activity activity, OnMarkerListener markerListener){
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listChildData;
        this._listData = listData;
        this._activity = activity;
        this._markerListener = markerListener;
    
    }
    
    .....
    
    @Override
    public View getChildView(final int groupPosition, final int childPosition,
                             boolean isLastChild, View convertView, ViewGroup parent) {
    
        final String childText = (String) getChild(groupPosition, childPosition);
        final String markerId = (String) getData(groupPosition, 0);
    
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_item2, null);
        }
    
        ImageButton btnMarker = (ImageButton) convertView.findViewById(R.id.imageButton);
        btnMarker.setImageResource(R.drawable.ic_place_black);
    
    
        btnMarker.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                _markerListener.onMarkerRead(markerId);
            }
        });
    
        return convertView;
    }
    

    【讨论】:

    • 谢谢。好这个代码更好。您的 markerListener 初始化方法可能是错误的,因为有时活动 null 返回 markerListener = (OnMarkerListener) 活动。您可以在片段创建时初始化markerListener Fragment fragmentWeb = new MainFragment(); fragmentWeb.markerListener = this;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 2020-02-27
    相关资源
    最近更新 更多