1.ListView使用方法
需要通过适配器来设置listView的内容。在构造函数中传入参数:代码如下
public class listViewAcitivity extends AppCompatActivity {
public String[]data = {
"Apple","Banana","Orange","Watermelon","Pear","Grape","Cherry"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view_acitivity);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(listViewAcitivity.this,
android.R.layout.simple_list_item_1,data);// 初始化适配器,第二个参数是子布局
ListView listview = findViewById(R.id.listview);
listview.setAdapter(adapter);
}
}
效果图:
定制界面:
首先创建水果类;
public class Fruit {
private String name;
private int imageID;
public Fruit(String name,int iamgeID){
this.name = name;
this.imageID = imageID;
}
public String getName(){
return name;
}
public int getImageID(){
return imageID;
}
}
再写一个适配器:
public class FruitAdapter extends ArrayAdapter<Fruit> {
private int resourceID;
public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects){
super(context,textViewResourceId,objects);
resourceID = textViewResourceId;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
Fruit fruit = getItem(position); //获取当前项的furit实例
View view = LayoutInflater.from(getContext()).inflate(resourceID,parent,false);
ImageView fruitImage = view.findViewById(R.id.fruitImage);
TextView fruitName = view.findViewById(R.id.ifRoom);
fruitImage.setImageResource(fruit.getImageID());
fruitName.setText(fruit.getName());
return view;
}
}
构造函数是这样 是因为它继承的构造函数就是这样。
另外需要重写getView()方法。在getView()方法中,首先通过getItem()方法取得实例。在LayoutInflater的inflate()方法中需要3个参数。第三个参数是false用途是:表示只让我们在父布局中声明的layout属性生效,但不为View添加父布局。
fruit_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="match_parent" > <ImageView android:id="@+id/fruitImage" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/fruitName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="10dp"/> </LinearLayout>
在Activity中
public class listViewAcitivity extends AppCompatActivity {
private List<Fruit> fruitList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view_acitivity);
initFruits(); //初始化水果数据
FruitAdapter adapter = new FruitAdapter(listViewAcitivity.this,R.layout.fruit_item,fruitList);
ListView listView = (ListView)findViewById(R.id.listView);
listView.setAdapter(adapter);
}
private void initFruits(){
for(int i = 0;i < 10;i++){//初始化同时声明图片地址
Fruit apple = new Fruit("Apple",R.drawable.icon_home);
fruitList.add(apple);
Fruit banana = new Fruit("Banana",R.drawable.icon_me);
fruitList.add(banana);
Fruit orange = new Fruit("Orange",R.drawable.icon_tree);
}
}
}
效果:
提高listView的效率,
利用缓存进行效率的提升。如果convertView 为Null ,则使用LayoutInflater去加载布局,如果不为空,则直接用convertView。另外,还可以使用ViewHolder来提高部分性能。代码如下:
public class FruitAdapter extends ArrayAdapter<Fruit> {
class ViewHolder{
ImageView fruitImage;
TextView fruitName;
}
private int resourceID;
public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects){
super(context,textViewResourceId,objects);
resourceID = textViewResourceId;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
Fruit fruit = getItem(position); //获取当前项的furit实例
View view ;
ViewHolder viewHolder;
if(convertView == null){
view = LayoutInflater.from(getContext()).inflate(resourceID,parent,false);
viewHolder = new ViewHolder();
viewHolder.fruitImage = view.findViewById(R.id.fruitImage);
viewHolder.fruitName = view.findViewById(R.id.fruitName);
view.setTag(viewHolder); //将viewHolder存储在view中
}
else {
view = convertView;
viewHolder = (ViewHolder) view.getTag(); //重新获取viewHolder
}
ImageView fruitImage = view.findViewById(R.id.fruitImage);
TextView fruitName = view.findViewById(R.id.fruitName);
viewHolder.fruitImage.setImageResource(fruit.getImageID());
viewHolder.fruitName.setText(fruit.getName());
return view;
}
}
点击事件
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
Fruit fruit = fruitList.get(position);
Toast.makeText(listViewAcitivity.this,fruit.getName() + " " + position,Toast.LENGTH_LONG).show();
}
});
position是从0开始。
RecycleView
把之前的fruit-item.xml 以及 fruit 类复制一份。
首先,必须引入相应的包:【在app/build.gradle】
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:28.+'
compile 'com.android.support:recyclerview-v7:28.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}
再写一个适配器:
public class FruitAdapter2 extends RecyclerView.Adapter<FruitAdapter2.ViewHolder> {
private List<Fruit> mFruitList;
static class ViewHolder extends RecyclerView.ViewHolder{
ImageView fruitImage;
TextView fruitName;
public ViewHolder(View view){
super(view);
fruitImage = view.findViewById(R.id.fruitImage);
fruitName = view.findViewById(R.id.fruitName);
}
}
public FruitAdapter2(List<Fruit> fruitList){
this.mFruitList = fruitList;
}
@NonNull
@Override
//创建viewHolder实例
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
//绑定元素
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Fruit fruit = mFruitList.get(position);
holder.fruitImage.setImageResource(fruit.getImageID());
holder.fruitName.setText(fruit.getName());
}
//返回数目
@Override
public int getItemCount() {
return mFruitList.size();
}
}
有一个内部类 ViewHolder。因为这个适配器是继承,因此要重写超类的部分方法。
Activity 代码:
public class recycleView extends AppCompatActivity {
private List<Fruit> fruitList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycle_view);
initFruits();
RecyclerView recyclerView = findViewById(R.id.RecycleView);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
FruitAdapter2 adapter2 = new FruitAdapter2(fruitList);
recyclerView.setAdapter(adapter2);
}
private void initFruits(){
for(int i = 0;i < 10;i++){
Fruit apple = new Fruit("Apple",R.drawable.icon_home);
fruitList.add(apple);
Fruit banana = new Fruit("Banana",R.drawable.icon_me);
fruitList.add(banana);
Fruit orange = new Fruit("Orange",R.drawable.icon_tree);
}
}
}
这里有一个注意的地方:要给recycleView设置一个布局。
设置为横向
fruit-item进行修改
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="100dp"
android:layout_height="wrap_content"
>
<ImageView
android:id="@+id/fruitImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"/>
<TextView
android:id="@+id/fruitName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"/>
</LinearLayout>
在activity中:在recyclerView.setLayoutManager(layoutManager);前面添加layoutManager.setOrientation(LinearLayout.HORIZONTAL); 即可实现
recycleView还为我们提供了GridLayoutManager 以及 StaggeredGridLayoutManager
: