Android實現頁面跳轉、ListView及其事件


Android實現頁面跳轉、ListView及其事件

開發工具:Andorid Studio 1.3
運行環境:Android 4.4 KitKat

工程內容

  1. 進入主頁面后,使用ListView實現特定頁面
  2. 點擊其中任何一項水果,跳轉到另外一個活動,使用Intent轉換活動,並使用Bundle傳遞數據,跳轉到特定頁面

代碼實現

首先在主頁面的xml文件中添加ListView控件並給予id

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".FruitList">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/fruitListView">
    </ListView>
</LinearLayout>

接着設計一個ListView中的Item,用線性水平布局加一個ImageView和一個TextView滿足要求,適當調整一下圖片的大小和文字的大小以及邊距,使得好看一些

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/fruit_image"
        android:adjustViewBounds="true"
        android:maxHeight="@dimen/fruit_image_size"
        android:maxWidth="@dimen/fruit_image_size"/>
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="@dimen/fruit_image_size"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:id="@+id/fruit_name"
        android:textSize="@dimen/fruit_name_size"
        android:gravity="center_vertical"/>
</LinearLayout>

在主類FruitList中獲取ListView的控件,然后給List 添加項,新建一個adapter綁定我們建的那個layout和List ,最后綁定到ListView中

fruitListView = (ListView)this.findViewById(R.id.fruitListView);

fruitList.add(new Fruit("apple", R.mipmap.apple));
fruitList.add(new Fruit("banana", R.mipmap.banana));
fruitList.add(new Fruit("cherry", R.mipmap.cherry));
fruitList.add(new Fruit("coco", R.mipmap.coco));
fruitList.add(new Fruit("kiwi", R.mipmap.kiwi));
fruitList.add(new Fruit("orange", R.mipmap.orange));
fruitList.add(new Fruit("pear", R.mipmap.pear));
fruitList.add(new Fruit("strawberry", R.mipmap.strawberry));
fruitList.add(new Fruit("watermelon", R.mipmap.watermelon));

FruitAdapter adapter = new FruitAdapter(FruitList.this, R.layout.fruit_item, fruitList);
fruitListView.setAdapter(adapter);

Class Fruit和class FruitAdapter的實現如下

public class Fruit {
    private String name;
    private int imageId;

    public Fruit(String _name, int _imageId){
        this.name = _name;
        this.imageId = _imageId;
    }

    public String getName(){
        return this.name;
    }

    public int getImageId(){
        return this.imageId;
    }
}

public class FruitAdapter extends ArrayAdapter<Fruit> {
    private int resourceId;

    public FruitAdapter(Context context, int textViewResourceId, List<Fruit> fruits){
        super(context, textViewResourceId, fruits);
        this.resourceId = textViewResourceId;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        Fruit fruit = getItem(position);
        View view = LayoutInflater.from(this.getContext()).inflate(resourceId, null);
        ImageView fruitImage = (ImageView)view.findViewById(R.id.fruit_image);
        TextView fruitName = (TextView)view.findViewById(R.id.fruit_name);

        fruitImage.setImageResource(fruit.getImageId());
        fruitName.setText(fruit.getName());

        return view;
    }
}

點擊某一個水果的響應是獲取水果的名字,加入到一個Bundle中去,然后綁定到一個Intent,傳遞到另一個界面

fruitListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        ListView listView = (ListView) parent;
        Fruit fruit = (Fruit) listView.getItemAtPosition(position);
        String name = fruit.getName();

        Intent intent = new Intent(FruitList.this, ShowFruitActivity.class);
        Bundle bundle = new Bundle();
        bundle.putString("name", name);
        intent.putExtras(bundle);
        startActivity(intent);
        //FruitList.this.finish();
    }
});

長按某一個水果的響應是:找到點擊的水果,然后在適配器中刪除這一水果,然后適配器發出改變通知,ListView更新刪除后的狀態

fruitListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        try {
            ListView listView = (ListView) parent;
            Fruit fruit = (Fruit) listView.getItemAtPosition(position);
            FruitAdapter adapter = (FruitAdapter)listView.getAdapter();
            adapter.remove(fruit);
            adapter.notifyDataSetChanged();
            listView.invalidate();
        } catch (Exception e) {
            Log.d("Hint", "Remove failed!");
            return false;
        }
        return true;
    }
});

顯示界面中獲取傳入的Bundle,修改textView中的值即可,給Button添加返回響應

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_show_fruit);

    Bundle bundle = getIntent().getExtras();
    String name = bundle.getString("name");

    TextView textView = (TextView)this.findViewById(R.id.show_fruit_name);
    textView.setText("I love " + name + " !!!");
    Button button = (Button)this.findViewById(R.id.btnBack);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //Intent intent = new Intent(ShowFruitActivity.this, Fruit.class);
            //startActivity(intent);
            ShowFruitActivity.this.finish();
        }
    });
}

效果圖

初始狀態->點擊cherry->跳轉頁面->點擊Back ->回到上一個界面->長按banana->刪除條目

cant show cant show cant show cant show

一些總結

  1. Import某一個包盡量利用Tab鍵的自動補全功能,Android Studio會自動添加包進來
  2. 創建新的一個界面用File->new的方法,避免了手動修改AndroidManifest.xml的錯誤
  3. Intent之間進行跳轉有技巧,主界面跳轉后不需要調用finish函數,而跳轉顯示的界面只需要調用finish結束即可回到上一個界面,即主界面
  4. 刪除功能要在適配器中刪除條目才有效,這點通過OverflowStack找到了解決方案,之前一直都不能成功

分別說明活動生存期在什么時候調用下列函數

  • onCreate()
    活動被創建的時候或者進程被殺死后用戶重新啟動該活動時,調用這個函數。
  • onStart()
    在onCreate()或onRestart()函數調用完成后,僅接着調用這個函數。
  • onResume()
    在onResume()函數調用完成后或被pause的活動重新回到前台時,僅接着調用這個函數。
  • onPause()
    當從一個activity跳轉到另一個activity的時候,當前activity會調用這個函數。
  • onStop()
    如果一個已經start的活動長時間沒有出現在屏幕中,則調用這個函數。
  • onDestory()
    當一個已經stop的活動關閉被系統回收資源的時候,調用這個函數
  • onRestart()
    當一個已經stop的活動需要重新顯示在屏幕的時候,調用這個函數

引用一張圖來說明,圖片來自水印:
feisky

活動的啟動模式有四種,standard,singleTop,singleTask以及singleInstance,列表說明不同的啟動方式有什么不同

活動模式 區別
standard 默認模式。只要創建了Activity實例,一旦激活該Activity,則會向任務棧中加入新創建的實例,退出Activity則會在任務棧中銷毀該實例
singleTop 考慮當前要激活的Activity實例在任務棧中是否正處於棧頂,如果處於棧頂則無需重新創建新的實例,會重用已存在的實例,否則會在任務棧中創建新的實例
singleTask 如果任務棧中存在該模式的Activity實例,則把棧中該實例以上的Activity實例全部移除,調用該實例的newInstance()方法重用該Activity,使該實例處於棧頂位置,否則就重新創建一個新的Activity實例
singleInstance Activity實例在任務棧中創建后,只要該實例還在任務棧中,即只要激活的是該類型的Activity,都會通過調用實例的newInstance()方法重用該Activity,此時使用的都是同一個Activity實例,它都會處於任務棧的棧頂。此模式一般用於加載較慢的,比較耗性能且不需要每次都重新創建的Activity

工程下載

傳送門:下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM