ListView這個控件,所有開發Android的人都會用過的吧,不過相對于RecyclerView而言,ListView我算是用的非常少的了。是以說到對ListView真正的多了解,自己卻并不是那麼熟悉,是以就重新去了解使用一番ListView,還可以配上Popupwindow + ListView + SearchView做一個組合類似的搜尋。之後的組合搜尋我之後會上傳。
先還是按照最基本的放上一個ListView的xml,以及一個ListView子項Item的xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.chenxuanhe.searchviewtest.MainActivity">
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
Item的xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<ImageView
android:id="@+id/list_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/list_txt"
android:layout_marginStart="10dp"
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="dadadadaadadd" />
</LinearLayout>
這是一個Imageview 和一個TextView最基本的搭配。
首先,一個ListView需要三樣東西:
1.資料工具類
2.擴充卡
3.ListView主代碼
1.(資料工具類)先建立一個Bean檔案
public class Bean {
private String name;
private int id;
public Bean(String name ,int Id){
this.name =name;
this.id=Id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
這是一個工具類,其中的Int id就是圖檔的id,也就是R.drawable.xxx這種格式,這裡需要說明一下,個人了解,有關于參數的int id部分,如果不是一個int 整形的傳參,那麼都可以了解為是傳遞一個R的id值,擴充卡的構造方法也會出現一個int id值,可以綜合了解。
當然資料這裡就自己給個資料數組
private String[] data = {"A", "B", "C", "D", "ad", "adaf", "E", "F",
"Q", "BW", "CE", "DR", "ad", "adaf", "Ez", "FX",
"A", "BZ", "CDD", "DFA", "ad", "adaf", "E", "F",
"AZCZ", "BC", "CBB", "DV", "adS", "adaf", "E", "F"};
2.擴充卡Adapter
關于這裡的擴充卡,我有一點模仿RecyclerView的适配寫法,因為傳統的ListView的擴充卡有三種,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter,并且他們的使用方式類似
listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData()));
這種感覺,當然可能是個人了解問題,由于本人用多了RecyclerView是以喜歡再寫一個擴充卡,這樣搭配上Holder更加的友善。這裡我們寫一個MyAdapter類作為我們的擴充卡,讓他去繼承ArrayAdapter《Bean》于是代碼如下:
class MyAdapter extends ArrayAdapter<Bean> {
private int ResourceId;
public MyAdapter(Context context, int txtId, List<Bean> obj) { // 該構造該函數的int id 就是需要R.layout.item這樣的方式
super(context, txtId, obj);
this.ResourceId = txtId;
}
//這是重寫最重要的一個方法同時進行了優化
//也用到了Holder的複用,對于ListView的性能大大優化
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
Bean bean = getItem(position);
MyHolder myHolder;
View view;
if (convertView == null) {
//如果view是空,則建立新對象,一系列操作,不然就直接複用存在View中的holder對象,避免重複new對象
view = LayoutInflater.from(getContext()).inflate(ResourceId, viewGroup, false);
myHolder = new MyHolder();
myHolder.txt = (TextView) view.findViewById(R.id.list_txt);
myHolder.img = (ImageView) view.findViewById(R.id.list_img);
view.setTag(myHolder);//将holder對象存進view
//Tag可以了解為一個标志,可自行百度
} else {
view = convertView;
myHolder = (MyHolder) view.getTag();//取出holder對象
}
//Holder對于view的複用,十分強大
myHolder.txt.setText(bean.getName());
myHolder.img.setImageResource(bean.getId());
return view;
}
}
class MyHolder {
ImageView img;
TextView txt;
}
3.ListView的主代碼,則肯定就是在MainActivity裡面啦。首先聲明一個工具類的List,用來存放會用到的資料
private List<Bean> beanList = new ArrayList<>();
之後的代碼如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);
MyAdapter adapter = new MyAdapter(this, R.layout.item_view, beanList);//這裡就是開始講到的int id的用法,将item的view作為id傳給構造方法,這樣new出一個擴充卡
ListView listView = (ListView) this.findViewById(R.id.list_view);
listView.setAdapter(adapter);
//這裡是用于ListView的每個子Item被點選到之後的操作
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Bean bean = beanList.get(i);
Toast.makeText(MainActivity.this, bean.getName(), Toast.LENGTH_SHORT).show();
}
});
init();
}
//這就是一個将開始的資料數組一次取出放入到之前聲明的list中去
//然後在new擴充卡的時候将聲明了的List放入擴充卡中就OK了
private void init() {
for (int i = ; i < data.length; i++) {
String one = data[i];
//注意看這裡就用到了Bean.class的構造方法中的int id
//這裡的id傳入的就是R.drawable.my這樣的R值
Bean bean = new Bean(one, R.drawable.my);
beanList.add(bean);
}
}
}
到這裡ListView的全部介紹完了,當然,就個人意見,能用到RecyclerView的就盡量用RecyclerView(RecyclerView+CardView的效果還是很好的呦~),因為覺得畢竟一個強大的控件就可以盡量多用,當然有些效果RecyclerView就沒有ListView那樣容易實作,是以也算是多少學習ListView的用法吧。
以下是效果圖: