使用 ListView 和 SimpleAdapter 展现数据
问题描述:该程序的作用是使用 ListView 和 SimpleAdapter 展现一个带图片的城市列表,当点击某一城市时,将在列表上方显示该城市名称
效果如下
代码实现
ListView的子项布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
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">
<ImageView
android:id="@+id/imageView"
android:layout_width="82dp"
android:layout_height="71dp"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginTop="16dp"
tools:srcCompat="@tools:sample/avatars" />
<TextView
android:id="@+id/cityName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="95dp"
android:layout_marginTop="43dp"
android:text="TextView" />
</RelativeLayout>
图样如下所示
创建Activity
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import com.example.androidtest.R;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SimpleAdapterActivity extends AppCompatActivity {
private TextView cityName;
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_simple_adapter);
cityName = findViewById(R.id.city_Name);
listView = findViewById(R.id.listView);
List<Map<String,Object>> data = new ArrayList<>();
int [] Imgids = {R.mipmap.ic_launcher,R.mipmap.ic_launcher,R.mipmap.ic_launcher,R.mipmap.ic_launcher,R.mipmap.ic_launcher};
String [] CityNames = {"北京","上海","深圳","广东","南京"};
for (int i=0;i<Imgids.length;i++){
Map<String,Object> map = new HashMap<>();
map.put("img",Imgids[i]);
map.put("CityName",CityNames[i]);
data.add(map);
}
SimpleAdapter adapter = new SimpleAdapter(this,data,R.layout.activity_simple_adapter_item,new String []{"img","CityName"},new int []{R.id.imageView,R.id.cityName});
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
cityName.setText(CityNames[position]);
}
});
}
}
Activity代码的解析
List<Map<String,Object>> data = new ArrayList<>();
int [] Imgids = {R.mipmap.ic_launcher,R.mipmap.ic_launcher,R.mipmap.ic_launcher,R.mipmap.ic_launcher,R.mipmap.ic_launcher};
String [] CityNames = {"北京","上海","深圳","广东","南京"};
for (int i=0;i<Imgids.length;i++){
Map<String,Object> map = new HashMap<>();
map.put("img",Imgids[i]);
map.put("CityName",CityNames[i]);
data.add(map);
}
- 上面一段是在创建数据然后将数据放到List集合里
- 为什么要将集合写成这样,那是因为
//创建Adapter
SimpleAdapter adapter = new SimpleAdapter(this,data,R.layout.activity_simple_adapter_item,new String []{"img","CityName"},new int []{R.id.imageView,R.id.cityName});
//绑定
listView.setAdapter(adapter);
- 创建Adapter的几个参数是上下文位置,数据,ListView的item布局,数据中的Map的key,与数据相对应的组件的id
listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
cityName.setText(CityNames[position]);
}
});
- onItemClick的参数解释
假设X, Y两个listview,X里有1,2,3,4这4个item,Y里有a,b,c,d这4个item。
如果你点了b这个item。
AdapterView<?> parent, // parent相当于listview Y适配器的一个指针,可以通过它来获得Y里装着的一切东西
View view, // view是你点b item的view的句柄,就是你可以用这个view,来获得b里的控件的id后操作控件
int position, // position是b在Y适配器里的位置(生成listview时,适配器一个一个的做item,然后把他们按顺序排好队,在放到listview里,意思就是这个b是第position号做好的)
long id // id是b在listviewY里的第几行的位置(很明显是第2行),大部分时候position和id的值是一样的