ListView:垂直列表顯示內(nèi)容
- ListView的作用
ListView只有一項工作但两,那就是展示數(shù)據(jù)扎即。它并不關系數(shù)據(jù)從哪而來吞获,數(shù)據(jù)到底是什么類型等等况凉,它只負責展示數(shù)據(jù)。但是衫哥,它要是沒數(shù)據(jù)的話也談不上展示了茎刚。所以它有一個好基友,那就是Adapter撤逢。ListView需要訪問什么數(shù)據(jù)膛锭,都是吩咐Adapter幫忙去訪問數(shù)據(jù)的。兩朋友形成了一種良好的工作模式蚊荣,Adapter只負責提供數(shù)據(jù)初狰,ListView只負責展示數(shù)據(jù)。所以要了解ListView那顆浪蕩不羈的心互例,我們也需要了解Adapter奢入,這樣才能更好地把控ListView的洪荒之力。 - Adapter的作用
Adapter做的工作媳叨,就是幫ListView去適配數(shù)據(jù)源的腥光,這樣ListView就不用煩惱數(shù)據(jù)的問題了,它就可以專心做好展示的工作糊秆。Adapter本身是一個接口武福,所以它能實現(xiàn)各種各樣的子類,子類就通過自己特定的邏輯去完成特定的功能痘番,去適配特定的數(shù)據(jù)捉片。例如,ArrayAdapter可以用于數(shù)組和List類型的數(shù)據(jù)源適配等等汞舱。
同時伍纫,我們繼承Adapter的時候,有一個灰常重要的方法需要我們重寫昂芜,那就是public View getView()方法莹规。 - 使用
1.創(chuàng)建ListView:.xml .代碼
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</ListView>
2.初始化數(shù)據(jù)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=findViewById(R.id.lv);
//初始化數(shù)據(jù)
initDate();
//設置行與行之間的間距
listView.setDividerHeight(20);
}
//準備數(shù)據(jù)源
public void initDate(){
friendModels=new ArrayList<>();
//創(chuàng)建一個好友
FriendModel model=new FriendModel(R.drawable.ic_launcher_foreground,"jack");
//添加到數(shù)組
friendModels.add(model);
}
}
/**
* ImageView:用于顯示圖片的額控件
* Bitmap:具體的某一張圖片數(shù)據(jù)
* R.drawable.bg:只是圖片對應的id
*/
public class FriendModel {
public int icon;
public String name;
public FriendModel(int icon, String name) {
this.icon = icon;
this.name = name;
}
}
3.配置數(shù)據(jù):創(chuàng)建一個類繼承BaseAdapter
//定義數(shù)據(jù)適配器
public class MyAdapter extends BaseAdapter{
//配置ListView有多少行
@Override
public int getCount() {
return friendModels.size();
}
//獲取數(shù)據(jù)源(數(shù)組:所有的數(shù)據(jù),如所有的好友的信息)里面position行對應的數(shù)據(jù)
@Override
public Object getItem(int position) {
return null;
}
//獲取position位置對應的id
//id就是這一行對應的索引值
@Override
public long getItemId(int position) {
return position;
}
//配置每行顯示什么內(nèi)容
@Override
public View getView(int position, View convertView, ViewGroup parent) {
/*
//創(chuàng)建文本視圖
TextView textView=new TextView(getApplicationContext());
textView.setText("row"+position);
textView.layout(0,0,300,100);
*/
//將一個layout.xml文件轉(zhuǎn)化為對應的視圖
View view=View.inflate(getApplicationContext(),R.layout.layout_qq,null);
return view;
}
}
4.設置ListView的適配器(數(shù)據(jù))
//設置適配器
listView.setAdapter(new MyAdapter());
5.創(chuàng)建layout布局每一行放入具體樣式
使用View.Inflate 解析layout布局文件->View
<View
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="@color/colorPrimaryDark"
android:tag="vTag"
/>
6.響應用戶的點擊事件setOnItemClickListener - onItemClick
//設置監(jiān)聽器監(jiān)聽用戶的行為
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//先將Item對應的視圖轉(zhuǎn)化為ViewGroup
ViewGroup viewGroup=(ViewGroup)view;
//查找容器里的子視圖
View v=viewGroup.findViewWithTag("vTag");
//操作這個視圖
v.setBackgroundColor(Color.BLACK);
//切換到下一個界面
//調(diào)用系統(tǒng)的或者某個應用的方式:隱式意圖
//Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//顯示意圖:直接指明跳轉(zhuǎn)到那個界面
Intent intent=new Intent(getApplicationContext(),SencondActivity.class);
//開始切換
startActivity(intent);
//新建跳轉(zhuǎn)的界面
public class SencondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sencond);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) {
finish();//關閉當前的界面
return true;
}
}
<androidx.constraintlayout.widget.ConstraintLayout 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"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".SencondActivity"
tools:showIn="@layout/activity_sencond">
</androidx.constraintlayout.widget.ConstraintLayout>
注意:每行顯示的內(nèi)容通常是用layout.xml配置文件
-
效果展示