BaseAdapter的三種表達式分析,startActivityForResult的使用

(一)BaseAdapter的三種表達式:java

①逗比式android

public View getView(int position, View convertView, ViewGroup parent) {

        //逗比式
        View view=minflater.inflate(R.layout.item,null);
        ImageView imageView=(ImageView) view.findViewById(R.id.iv_image);
        TextView title=(TextView) view.findViewById(R.id.tv_title);
        TextView content=(TextView) view.findViewById(R.id.tv_content);
        ItemBean bean=mlist.get(position);
        imageView.setImageResource(bean.imageid);
        title.setText(bean.title);
        content.setText(bean.content);
        return view;
}

每進行一次getView就要利用inflater對象去建立一個新的view,並在View中找到相應的控件並給他設置相應的值,這樣徹底沒有利用到ListView的緩存機制,所以稱爲「逗比式」。小程序

②普通式數組

既然「逗比式」沒有利用到緩存機制,那麼咱們的普通式就要好好利用。緩存

如何利用?咱們須要判斷一下convertview是否已經緩存過,若是沒有緩存過就建立一個view。以下面的代碼:app

//普通式
       if(convertView==null)
        {
            convertView=minflater.inflate(R.layout.item,null);
        }
        ImageView imageView=(ImageView) convertView.findViewById(R.id.iv_image);
        TextView title=(TextView) convertView.findViewById(R.id.tv_title);
        TextView content=(TextView) convertView.findViewById(R.id.tv_content);
        ItemBean bean=mlist.get(position);
        imageView.setImageResource(bean.imageid);
        title.setText(bean.title);
        content.setText(bean.content);
        return convertView;
}

他雖然對緩存資源進行了合理的利用,可是仍是存在一些問題,不夠優化,每次都要去佈局中需找部件,findviewbyid是很耗費時間的,這樣在小程序中可能體現不出什麼,可是總歸是耗費時間的,所以咱們要對其進行優化。ide

③文藝式:佈局

在文藝式中咱們須要爲findviewbyid進行優化,優化

 //文藝式
        /*利用ViewHolder優化BaseAdapter思路:
        1.建立Bean對象,用於封裝數據
        2.在構造方法中初始化用於映射的數據List
        3.建立ViewHolder類,建立佈局映射關係
        4.判斷convertView,爲空則建立,並設置tag;不然經過tag來取出viewholder
        5.給viewholder中的空間設置數據*/

        ViewHolder viewHolder;
        if(convertView==null){
            convertView=minflater.inflate(R.layout.item,null);
            viewHolder=new ViewHolder();
            viewHolder.imageView=(ImageView)convertView.findViewById(R.id.iv_image);
            viewHolder.title=(TextView)convertView.findViewById(R.id.tv_title);
            viewHolder.content=(TextView)convertView.findViewById(R.id.tv_content);
            convertView.setTag(viewHolder);
        }else{
            viewHolder=(ViewHolder) convertView.getTag();
        }
        ItemBean bean=mlist.get(position);
        viewHolder.imageView.setImageResource(bean.imageid);
        viewHolder.title.setText(bean.title);
        viewHolder.content.setText(bean.content);
        return convertView;
    }
    class ViewHolder{
        public ImageView imageView;
        public TextView title;
        public TextView content;
    }

(二)startActivityForResult的應用this

startActivityForResult startActivityForResult(Intent intent, int requestCode)。這個方法我通常用來在ActivityA中啓動另個activityB。當返回的時候須要攜帶來自B的數據。ActivityA更新界面。
1.首先要在activityA中啓動startActivityForResult(Intent intent, int requestCode)

btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,HeadActivity.class);
                startActivityForResult(intent,0x11);
            }
        });

參數1.就是一個intent 你能夠攜帶一些數據。固然也能夠不攜帶

參數2.requescode,你自定義的一個int類型的數值(通常>0);

2.還有一個方法。這個方法是在ActivityB中使用的,主要必定要在finish()以前調用該方法,否則不起做用

setResult(int resultCode, Intent data)

 gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent=getIntent();
                Bundle bundle=new Bundle();
                bundle.putInt("imageId",imageId[position]);
                intent.putExtras(bundle);
                setResult(0x11,intent);
                finish();
            }
        });

一樣仍是兩個參數,

參數1:resultcode,先說做用。這個參數有兩個做用。第一個能夠用來判斷有沒有返回成功。還有一個做用一樣能夠判斷是從哪一個activity返回來的

 爲何呢。這個參數能夠自定義。若是返回成功了,當時你在activityB中定義的什麼,那麼 在

onActivityResult(int requestCode, int resultCode, Intent data)這個方法中就會接收到什麼。因此能夠用來判斷來這哪一個activity。 若是失敗了(好比你在ActivityB中直接按了返回鍵。什麼都沒有操做),這種狀況在ActivityA中接收到的requestcode 就是0. 因此這個參數我通常用來判斷是否返回成功。

3.最後在ActivityA中onActivityResult(int requestCode, int resultCode, Intent data)中接收數據,並判斷requestCode和resultCode是否是你想要的,而後進行取值。

 

一個案例:進行頭像的切換

 

 點擊切換頭像,到另外一個頁面

 

 選好後,就會自動回到上個頁面而且頭像切換成功

 

 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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:background="@drawable/beijing"
    android:paddingTop="40dp"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/t_image"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_gravity="center_horizontal"
        android:src="@drawable/touxiang" />

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:layout_gravity="center_horizontal"
        android:text="選擇頭像"
        />

</LinearLayout>

activity_head.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    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"
    tools:context=".HeadActivity">
    <GridView
        android:id="@+id/gridView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="10dp"
        android:horizontalSpacing="3dp"
        android:verticalSpacing="3dp"
        android:numColumns="4">
    </GridView>
</RelativeLayout>

MainActivity.java

package com.example.startactivityforresult;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    ImageView imageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn=(Button)findViewById(R.id.btn);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,HeadActivity.class);
                startActivityForResult(intent,0x11);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode,  Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode==0x11 && resultCode==0x11)
        {
            Bundle bundle=data.getExtras();
            int image=bundle.getInt("imageId");
            int k=bundle.getInt("word");
            imageView=(ImageView)findViewById(R.id.t_image);
            imageView.setImageResource(image);
        }
    }
}

HeadActivity.java

package com.example.startactivityforresult;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.Toast;

public class HeadActivity extends AppCompatActivity {
    public int[] imageId = new int[]{R.drawable.touxiang1, R.drawable.touxiang2,
            R.drawable.touxiang3, R.drawable.touxiang4, R.drawable.touxiang5
    };   // 定義並初始化保存頭像id的數組

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_head);
        GridView gridView=(GridView)findViewById(R.id.gridView);
        BaseAdapter baseAdapter=new BaseAdapter() {

            @Override
            public int getCount() {
                return imageId.length;
            }

            @Override
            public Object getItem(int position) {
                return position;
            }

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

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                ImageView imageView;
                if(convertView==null){
                    imageView=new ImageView(HeadActivity.this);
                    imageView.setAdjustViewBounds(true);
                    imageView.setMaxHeight(158);
                    imageView.setMaxWidth(150);
                    imageView.setPadding(5, 5, 5, 5);
                }else{
                    imageView=(ImageView)convertView;
                }
                imageView.setImageResource(imageId[position]);
                return imageView;
            }
        };
        gridView.setAdapter(baseAdapter);
        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent=getIntent();
                Bundle bundle=new Bundle();
                bundle.putInt("imageId",imageId[position]);
                intent.putExtras(bundle);
                setResult(0x11,intent);
                finish();
            }
        });
    }
}
相關文章
相關標籤/搜索