ListView简单复用原理:
ListView的复杂复用原理:
如微博就是这么做的,看图
一个Item我们把它拆为来三个部分,首先头部、正文、评论操作栏都可可以在很多不同类型的数据Item中进行复用,文字、图片等的View也可以单独进行复用,而且最重要的是:缓存ArrayList中保存的View数量将会减少,内存消耗减了不少。
来一个简单的一个例子帮助大家理解:
package com.example.administrator.listviewdemo_getitemviewtype;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
public class MainActivity extends AppCompatActivity {
private ListView lv;
private String[] str={"b","b","a","c","c","a","b","c","a","c","b","a","b","c"};
private CompleAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv= (ListView) findViewById(R.id.lv);
adapter=new CompleAdapter(this,str);
lv.setAdapter(adapter);
}
}
package com.example.administrator.listviewdemo_getitemviewtype;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.TextView;
/**
* Created by Administrator on 2016/11/16.
*/
public class CompleAdapter extends BaseAdapter {
private Context context;
private String[] str;
private static final int TYPE_A=0;
private static final int TYPE_B=1;
private static final int TYPE_C=2;
private static final int TYPE_Count=3;
public CompleAdapter(Context context, String[] str){
this.context=context;
this.str=str;
}
@Override
public int getCount() {
return str.length;
}
@Override
public Object getItem(int i) {
return str[i];
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public int getItemViewType(int position) {
int type=0;
if(str[position]=="a"){
type=TYPE_A;
}else if(str[position]=="b"){
type=TYPE_B;
}else if(str[position]=="c"){
type=TYPE_C;
}
return type;
}
@Override
public int getViewTypeCount() {
return TYPE_Count;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder holder=null;
if(view==null){
holder=new ViewHolder();
switch (getItemViewType(i)){
case TYPE_A:
view=View.inflate(context,R.layout.item_a,null);
holder.tv1= (TextView) view.findViewById(R.id.tvA);
break;
case TYPE_B:
view=View.inflate(context,R.layout.item_b,null);
holder.tv2= (TextView) view.findViewById(R.id.tvB);
break;
case TYPE_C:
view=View.inflate(context,R.layout.item_c,null);
holder.tv3= (EditText) view.findViewById(R.id.etC);
break;
}
view.setTag(holder);
}else{
holder= (ViewHolder) view.getTag();
switch (getItemViewType(i)){
case TYPE_A:
holder.tv1.setText("这是第一个");
break;
case TYPE_B:
holder.tv2.setText("这是第二个");
break;
case TYPE_C:
holder.tv3.setText("这是第三个");
break;
}
}
return view;
}
class ViewHolder{
TextView tv1;
TextView tv2;
EditText tv3;
}
}
<?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">
<TextView
android:id="@+id/tvA"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="1"
android:layout_gravity="center_vertical"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"/>
</LinearLayout>
<?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="0dp"
android:layout_weight="1"
android:src="@mipmap/ic_launcher"
android:layout_height="wrap_content" />
<ImageView
android:layout_width="0dp"
android:layout_weight="1"
android:src="@mipmap/ic_launcher"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tvB"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"/>
</LinearLayout>
<?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="match_parent">
<EditText
android:id="@+id/etC"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:hint="hao"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"/>
</LinearLayout>