(一)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(); } }); } }