Android簡單版天氣預報,前期基本構建(第一步)

Android簡單版天氣預報,前期基本構建(第一步)

這是我第一次寫博客,剛上大二,想用博客來鞏固我的知識,也希望能幫助到看到這篇文章的人,寫的不好也請多多指出,打算一個星期更新一次

這個星期實現的:用簡單的ListView實現選擇城市,可添加城市,刪除城市,只有選擇四個城市
首先說以下我自己的學習方法,如果不瞭解用法,我會從最把基礎的東西先學會,例如ListView

ListView最基本用法:
ArrayAdapter:最簡單的一個Adapter,只能展現一行文字
ArrayAdapter的兩個構造方法
public ArrayAdapter (Context context, int resource, int textViewResourceId, List objects)
public ArrayAdapter (Context context, int resource, List objects)

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class SelectCity extends AppCompatActivity {
    private ListView listView;
    private List<String> list=new ArrayList<>();
    private ArrayAdapter<String> adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_select_city);
        listView=findViewById(R.id.lv_select);
        list.add("北京");
        list.add("上海");
        list.add("廣州");
        list.add("深圳");
        adapter=new ArrayAdapter<String>(SelectCity.this,android.R.layout.simple_list_item_1,list);
        listView.setAdapter(adapter);
    }
}

注:android.R.layout.simple_list_item_1是Android自帶的佈局

SimpleAdapter:同樣具有良好擴展性的一個Adapter,可以自定義多種效果
SimpleAdapter(Context context, List<? extends Map

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class SelectCity extends AppCompatActivity {
    private ListView listView;
    private List<HashMap<String,String>> listMap=new ArrayList<>();
    private SimpleAdapter simpleAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_select_city);
        listView=findViewById(R.id.lv_select);
        HashMap<String,String> hashMap=new HashMap<>();
        for(int i=0;i<4;i++){
            hashMap.put("1","北京");
            hashMap.put("2","上海");
            hashMap.put("3","廣州");
            hashMap.put("4","深圳");
            listMap.add(hashMap);
        }
        simpleAdapter=new SimpleAdapter(SelectCity.this,
                listMap,android.R.layout.simple_list_item_2,
                new String[]{"1","2","3","4"},
                new int[]{android.R.id.text1,android.R.id.text2});
        listView.setAdapter(simpleAdapter);
    }
}

注:後面兩個參數:from相當於設置HashMap的key找到value,to相當於向設置android.R.layout.simple_list_item_2裏的組件

BaseAdapter:抽象類,用得最多的一個Adapter,可以自定義,相信會上面兩種方法,這種方法理解起來也比較容易,首先初始化城市列表(建一個城市類),寫一個自定義的adapter繼承BaseAdapter(構造函數傳入城市列表List),需要自定義佈局,添加自定義的adapter

自定義適配器(CityAdapter)

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

public class CityAdapter extends BaseAdapter {
    private List<CityItem> list;

    public CityAdapter(List<CityItem> list){
        this.list=list;
    }
    @Override
    public View getView(final int i, View view, ViewGroup viewGroup) {
        TextView TVcityName;
        //刪除城市
        ImageView ivDelCity;
        if(view==null){
            view= LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.city_item,viewGroup,false);
        }
        CityItem cityItem= list.get(i);
        TVcityName=view.findViewById(R.id.tv_city_name);
        TVcityName.setText(cityItem.getCityName());

        //刪除城市
        ivDelCity=view.findViewById(R.id.iv_del_city);
        ivDelCity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                list.remove(i);
                notifyDataSetChanged();//本身就是adapter
            }
        });
        return view;
    }
    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }
}

自定義佈局(city_item)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:gravity="center">

    <ImageView
        android:id="@+id/btn_query"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_centerVertical="true"
        android:src="@drawable/select"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="100dp"
        android:textSize="25sp"
        android:id="@+id/tv_city_name"
        android:layout_centerVertical="true"
        android:textColor="#fff"
        android:layout_toRightOf="@id/btn_query"
        android:text="城市" />
    <ImageView
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_marginLeft="100dp"
        android:id="@+id/iv_del_city"
        android:layout_toRightOf="@id/tv_city_name"
        android:src="@drawable/delete"
        android:layout_centerVertical="true" />

</RelativeLayout>

主要方法(包含後面添加與刪除的代碼)

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class SelectCity extends AppCompatActivity{
    //ListView使用
    private ListView listView;
    private List<CityItem> list = new ArrayList<>();
    private CityAdapter cityAdapter;

    //返回按鈕
    private Button btnBackMain;
    //添加按鈕
    private Button btnAddCity;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_select_city);
        listView = findViewById(R.id.lv_select);
        btnBackMain = findViewById(R.id.btn_back);
        btnAddCity = findViewById(R.id.btn_add);
        //ListView使用
        CityItem guangzhou = new CityItem("廣州");
        CityItem shanghai = new CityItem("上海");
        list.add(guangzhou);
        list.add(shanghai);
        cityAdapter = new CityAdapter(list);
        listView.setAdapter(cityAdapter);
        //返回按鈕
        btnBackMain.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(SelectCity.this, MainActivity.class);
                startActivity(intent);
                finish();
            }
        });
        //添加城市
        btnAddCity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final String[] Country = {"廣州", "深圳", "上海", "北京"};
                final boolean[] booleans = {false, false, false, false};
                AlertDialog.Builder dialog = new AlertDialog.Builder(SelectCity.this);
                dialog.setTitle("對不起,您只能選擇以下四個城市");
                dialog.setSingleChoiceItems(Country, 0, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        for (int j = 0; j < Country.length; j++) {
                            if (Country[j].equals(Country[i])) {
                                booleans[i] = true;
                            }
                        }
                    }
                });
                dialog.setPositiveButton("確定", new DialogInterface.OnClickListener() {
                    int CountryNameInt;
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        for (int j = 0; j < booleans.length; j++) {
                            if (booleans[j]) {
                                CountryNameInt = j;
                                break;
                                //Toast.makeText(AddCountryActivity.this,CountryName,Toast.LENGTH_LONG).show();
                            }
                        }
                        //初始化城市
                        CityItem cityItem=null;
                        //判斷哪個城市選中
                        for(int k=0;k<booleans.length;k++){
                            if(k==CountryNameInt){
                                Toast.makeText(SelectCity.this, Country[CountryNameInt], Toast.LENGTH_LONG).show();
                                cityItem=new CityItem(Country[CountryNameInt]);
                                list.add(cityItem);
                                cityAdapter.notifyDataSetChanged();
                                break;
                            }
                        }
                    }
                });
                dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                    }
                });
                dialog.create();
                dialog.show();
            }
        });

    }

}

ListView基本用法就到這裏,不過官方現在推薦用RecycleView,感興趣的可以去實現一下
接下來實現添加城市,刪除城市,選擇城市後期會用到,現在暫時不是實現
添加城市主要代碼(利用了對話框)

btnAddCity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final String[] Country = {"廣州", "深圳", "上海", "北京"};
                final boolean[] booleans = {false, false, false, false};
                AlertDialog.Builder dialog = new AlertDialog.Builder(SelectCity.this);
                dialog.setTitle("對不起,您只能選擇以下四個城市");
                dialog.setSingleChoiceItems(Country, 0, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        for (int j = 0; j < Country.length; j++) {
                            if (Country[j].equals(Country[i])) {
                                booleans[i] = true;
                            }
                        }
                    }
                });
                dialog.setPositiveButton("確定", new DialogInterface.OnClickListener() {
                    int CountryNameInt;//記住選擇城市的下標
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        for (int j = 0; j < booleans.length; j++) {
                            if (booleans[j]) {
                                CountryNameInt = j;
                                break;
                                //Toast.makeText(AddCountryActivity.this,CountryName,Toast.LENGTH_LONG).show();
                            }
                        }
                        //初始化城市
                        CityItem cityItem=null;
                        //判斷哪個城市選中
                        for(int k=0;k<booleans.length;k++){
                            if(k==CountryNameInt){
                                //Toast.makeText(SelectCity.this, Country[CountryNameInt], Toast.LENGTH_LONG).show();
				//找到所選的城市後添加城市
                                cityItem=new CityItem(Country[CountryNameInt]);
                                list.add(cityItem);
                                cityAdapter.notifyDataSetChanged();//記得刷新
                                break;
                            }
                        }
                    }
                });
                dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                    }
                });
                dialog.create();
                dialog.show();
            }
        });

刪除城市,在adapter中實現

ivDelCity=view.findViewById(R.id.iv_del_city);
        ivDelCity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                list.remove(i);
                notifyDataSetChanged();//本身就是adapter
            }
        });

好了,這星期就更新到這,初次入博,請多關照

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章