Java 在android应用程序的“历史记录”选项卡中更新和持久化历史记录

Java 在android应用程序的“历史记录”选项卡中更新和持久化历史记录,java,android,listview,android-fragments,sharedpreferences,Java,Android,Listview,Android Fragments,Sharedpreferences,该应用程序在EditText中获取城市名称并搜索天气。该应用程序有三个选项卡(主页、历史记录和关于)。我想存储搜索到的cityname,并在“历史记录”选项卡中将其显示为listview。代码中有一个MainActivity和三个片段。我正在使用SharedReferences存储cityname,但每次打开应用程序列表视图时都是空的。 1.有谁能建议我如何实现这个功能吗? 2.我如何实现一个功能,以便当我在ListView中单击历史记录项时,它会将我带到“搜索”选项卡并显示所单击条目的天气 M

该应用程序在EditText中获取城市名称并搜索天气。该应用程序有三个选项卡(主页、历史记录和关于)。我想存储搜索到的cityname,并在“历史记录”选项卡中将其显示为listview。代码中有一个MainActivity和三个片段。我正在使用SharedReferences存储cityname,但每次打开应用程序列表视图时都是空的。 1.有谁能建议我如何实现这个功能吗? 2.我如何实现一个功能,以便当我在ListView中单击历史记录项时,它会将我带到“搜索”选项卡并显示所单击条目的天气

MainActivity            
public class MainActivity extends AppCompatActivity implements Tab1Fragment.Tab1FragmentListener ,Tab2Fragment.Tab2FragmentListener{

                private static final String TAG="MainActivity";
                private SectionsPageAdapter mySectionPageAdapter;
                private ViewPager viewPager;
                private DataForTabs dataForTabs;
                private Tab1Fragment tab1Fragment;
                private Tab2Fragment tab2Fragment;
                String input="";
                public static SharedPreferences sharedPreferences;
                ArrayList<String> arrayList;
                 @Override
                public void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main);

                    Log.d(TAG,"onCreate: Starting.");
                    tab1Fragment=new Tab1Fragment();
                    tab2Fragment=new Tab2Fragment();
                    Log.i(" From 1 to main ", "input");
                    Log.i(" From 1 to main ", input);

                    mySectionPageAdapter=new SectionsPageAdapter(getSupportFragmentManager());
                    //set up the ViewPager with the sections adaptor
                    viewPager=(ViewPager)findViewById(R.id.container);
                    setupViewPager(viewPager);

                    TabLayout tabLayout=(TabLayout)findViewById(R.id.tabs);
                    tabLayout.setupWithViewPager(viewPager);
                    sharedPreferences=this.getSharedPreferences("com.utb.iftekhar.cityweatherappsnapshot1", Context.MODE_PRIVATE);
                }
                public void setupViewPager(ViewPager viewPager){
                    SectionsPageAdapter adapter=new SectionsPageAdapter(getSupportFragmentManager());
                    adapter.addFragment(new Tab1Fragment(),"Home");
                    adapter.addFragment(new Tab2Fragment(),"History");
                    adapter.addFragment(new Tab3Fragment(),"About");
                    viewPager.setAdapter(adapter);
                }
                @Override
                public void onInput1Set(String input) {
                        tab2Fragment.updateEditText(input);
                    arrayList=new ArrayList<>();
                    arrayList.add(input);        
                    try {

                        sharedPreferences.edit().putString("arrayList",ObjectSerializer.serialize(arrayList)).apply();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    }

                @Override
                public void onInput2Sent(String input) {
                    tab1Fragment.updateEditText(input);
                    Log.i("from 2 to main", input);
                }
            }

The Search Tab
        public class Tab1Fragment extends Fragment{
            private MainActivity mainActivity;
            private Button getWeatherButton;
            private EditText searchCityByName;
            private TextView weatherResultTextView=null;
            private DownloadTask downloadTask;
            private String weatherResults;
            private Tab1FragmentListener tab1FragmentListener;
            private String cityNameSearched;

            public interface Tab1FragmentListener{
                void onInput1Set(String input);
            }
            @Nullable
            @Override
            public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
               View view=inflater.inflate(R.layout.tab1_frag, container, false);
                getWeatherButton=(Button)view.findViewById(R.id.getWeatherButton);
                searchCityByName=(EditText)view.findViewById(R.id.searchCityByName);
                weatherResultTextView=(TextView)view.findViewById(R.id.weatherResult);
                mainActivity=new MainActivity();
                getWeatherButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        downloadTask=new DownloadTask(new DownloadTask.AsyncResponse() {
                            @Override
                            public void processFinish(String output) {
                                if(!output.equals("")){
                                    weatherResultTextView.setText(output);
                                }else{
                                    weatherResultTextView.setText("");
                                }
                            }

                        });

                          cityNameSearched=searchCityByName.getText().toString().trim();
                            tab1FragmentListener.onInput1Set(cityNameSearched);
                        Log.i("CityNameSearched", cityNameSearched);
                        try {

                            String encodedCityName= URLEncoder.encode(cityNameSearched,"UTF-8" );
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                        downloadTask.execute("https://openweathermap.org/data/2.5/weather?q="+cityNameSearched+"&appid=b6907d289e10d714a6e88b30761fae22");

                        Log.i("Button Cliked","Clicked");
                        InputMethodManager mgr=(InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                        mgr.hideSoftInputFromWindow(searchCityByName.getWindowToken(), 0);

                    }
                });
                return view;
            }

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

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

            public void updateEditText(String newText){
                searchCityByName.setText(newText);
            }

        }
The History tab implemetation
    public class Tab2Fragment extends Fragment {
        private static final String TAG="Tab2Fragment";
        private Button button;
        private static  final String CITY_NAME_SEARCHED="cityNameSearched";
        private List<String> historyList;
        private ListView historyListView;
        private ArrayAdapter<String> arrayAdapter;
        private SharedPreferences sharedPreferences;
        private Tab2FragmentListener tab2FragmentListener;
        String cityNameSearched="";
        MainActivity mainActivity;
        public interface Tab2FragmentListener{
            void onInput2Sent(String input);
        }

    public Tab2Fragment(){
        Log.i("Tab2Fragmentconstructor","called");
    }

        @Nullable
        @Override
        public View onCreateView(final LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view=inflater.inflate(R.layout.tab2_frag, container, false);
            historyListView=view.findViewById(R.id.historyList);
            try {
                sharedPreferences = getActivity().getSharedPreferences("com.utb.iftekhar.cityweatherappsnapshot1", getActivity().MODE_PRIVATE);
                historyList=(ArrayList<String>)ObjectSerializer.deserialize(sharedPreferences.getString("arrayList", ObjectSerializer.serialize(new ArrayList<String>())));

            arrayAdapter=new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1,historyList);

            historyListView.setAdapter(arrayAdapter);
            historyListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    tab2FragmentListener.onInput2Sent(historyList.get(position));
                    Toast.makeText(getActivity(), historyList.get(position), Toast.LENGTH_SHORT).show();
                }
            });
            }catch (Exception e){
                e.printStackTrace();
            }
            return view;
     }


        public void updateEditText(String newText){
            Log.i("reced from 1 in 2 in 2",newText);
        }

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

        @Override
        public void onDetach() {
            super.onDetach();
            tab2FragmentListener=null;
        }
    }
main活动
公共类MainActivity扩展AppCompatActivity实现Tab1Fragment.Tab1FragmentListener、Tab2Fragment.Tab2FragmentListener{
私有静态最终字符串TAG=“MainActivity”;
专用分区SPAGEAdapter mySectionPageAdapter;
私人视页机视页机;
私有DataForTabs DataForTabs;
私有tab1片段tab1片段;
私有Tab2Fragment Tab2Fragment;
字符串输入=”;
公共静态SharedReferences SharedReferences;
ArrayList ArrayList;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(标记“onCreate:Starting”);
tab1Fragment=新的tab1Fragment();
tab2Fragment=新的tab2Fragment();
Log.i(“从1到主”、“输入”);
Log.i(“从1到主”,输入);
mySectionPageAdapter=newSectionSpageAdapter(getSupportFragmentManager());
//使用分区适配器设置ViewPager
viewPager=(viewPager)findViewById(R.id.container);
设置viewPager(viewPager);
TabLayout TabLayout=(TabLayout)findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
SharedReferences=this.getSharedReferences(“com.utb.iftekhar.cityweatherapsnapshot1”,Context.MODE\u PRIVATE);
}
公共无效设置ViewPager(ViewPager ViewPager){
SectionsPageAdapter=新的SectionsPageAdapter(getSupportFragmentManager());
addFragment(新的Tab1Fragment(),“Home”);
addFragment(新的Tab2Fragment(),“History”);
addFragment(新的Tab3Fragment(),“About”);
viewPager.setAdapter(适配器);
}
@凌驾
公共无效onInput1Set(字符串输入){
tab2Fragment.updateEdit(输入);
arrayList=新的arrayList();
arrayList.add(输入);
试一试{
SharedReferences.edit().putString(“arrayList”,ObjectSerializer.serialize(arrayList)).apply();
}捕获(例外e){
e、 printStackTrace();
}
}
@凌驾
public void onInput2Sent(字符串输入){
tab1Fragment.UpdateEdit(输入);
Log.i(“从2到主”,输入);
}
}
“搜索”选项卡
公共类Tab1Fragment扩展片段{
私人活动;
私人按钮;
私有编辑文本搜索CityByName;
私有文本视图weatherResultTextView=null;
私有下载任务下载任务;
私有字符串结果;
私有选项卡1FragmentListener选项卡1FragmentListener;
私有字符串citynamesearch;
公共接口选项卡1FragmentListener{
无效onInput1Set(字符串输入);
}
@可空
@凌驾
创建视图时的公共视图(LayoutFlater充气机、@Nullable ViewGroup容器、@Nullable Bundle savedInstanceState){
视图=充气机。充气(R.layout.tab1\u frag,容器,假);
getWeatherButton=(按钮)view.findViewById(R.id.getWeatherButton);
searchCityByName=(EditText)view.findViewById(R.id.searchCityByName);
weatherResultTextView=(TextView)view.findViewById(R.id.weatherResult);
mainActivity=新的mainActivity();
getWeatherButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
downloadTask=新的downloadTask(新的downloadTask.AsyncResponse(){
@凌驾
公共void processFinish(字符串输出){
如果(!output.equals(“”){
weatherResultTextView.setText(输出);
}否则{
weatherResultTextView.setText(“”);
}
}
});
cityNameSearched=searchCityByName.getText().toString().trim();
tab1FragmentListener.onInput1Set(cityNameSearched);
Log.i(“CityNameSearched”,CityNameSearched);
试一试{
字符串encodedCityName=URLEncoder.encode(cityNameSearched,“UTF-8”);
}捕获(例外e){
e、 printStackTrace();
}
下载任务。执行(“https://openweathermap.org/data/2.5/weather?q=“+cityNameSearched+”&appid=b6907d289e10d714a