学习目标:
由于今天没有太多时间去写生词本的内容,简单展示下实现gridview布局界面(虽然简单,但是里面的adapter及布局逻辑对于我这种小白来说还是有点费劲),这次内容是基于上一篇我写的实现登录的博客登录跳转的,效果如下:
先展示下代码的架构:
布局界面就没什么好说的了,这里实现了一行三列的gridview:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent">
<GridView
android:id="@+id/grid_laout"
android:numColumns="3"
android:verticalSpacing="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
这里为了操作方便,我设置了一个接口类(gridview_interface),以后每个模块也会加一个接口类,把一些全局可访问的变量和一些资源及方法写在里面,便于外部调用:
package com.example.studyapp.gridview;
import com.example.studyapp.R;
import java.util.ArrayList;
import java.util.List;
public class gridview_interface {
public static List<GridviewEntity> listall=new ArrayList<>();
public static void setList()//要执行此内容,外部需要调用此方法
{
listall.add(new GridviewEntity("生词本", R.mipmap.word));
for (int i = 0; i < 9; i++) {
listall.add(new GridviewEntity("暂未开放"+i, R.mipmap.wu));
}
}
}
这里创建一个实体类(gridview子视图数据实体):
package com.example.studyapp.gridview;
public class GridviewEntity {//定义GridView中每一个的实体
String title;
int Drawrouse;
GridviewEntity(String title,int Drawrouse)
{
this.title=title;
this.Drawrouse=Drawrouse;
}
public String getTitle() {
return title;
}
public int getDrawrouse() {
return Drawrouse;
}
}
下面看activity里的逻辑代码:
package com.example.studyapp.gridview;
import android.os.Bundle;
import com.example.studyapp.R;
import androidx.appcompat.app.AppCompatActivity;
import android.widget.GridView;
public class SecondActivity extends AppCompatActivity {
private GridView grid_laout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
init();
}
private void init() {
grid_laout=findViewById(R.id.grid_laout);
GridviewAdapter adapter=new GridviewAdapter(this);
grid_laout.setAdapter(adapter);
}
}
接下来创建Gridview的适配器,用于填充GridView的每一个子项,我们去继承BaseAdapter并重写其中的必要函数,在这里面写了一个ViewHolder内部类,使得系统不用去重复加载每一个视图,提示了效率:
package com.example.studyapp.gridview;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.studyapp.R;
import java.util.ArrayList;
import java.util.List;
public class GridviewAdapter extends BaseAdapter {
private List<GridviewEntity> list=new ArrayList<>();
private Context context;
GridviewAdapter(Context context1) {
gridview_interface.setList();
list=gridview_interface.listall;
context=context1;
Log.w("sssss",gridview_interface.listall.size()+"");
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
//首先通过下面的if/else获取到了装入了正在显示的第position个view的两个控件的ViewHolder
//再给holder更新视图
if(convertView==null)
{
holder=new ViewHolder();
convertView= LayoutInflater.from(context).inflate(R.layout.grid_laoutunit,null);
holder.titleview=(ImageView) convertView.findViewById(R.id.title_view);
holder.title=(TextView) convertView.findViewById(R.id.text_title);
convertView.setTag(holder);
}
else
{
holder= (ViewHolder) convertView.getTag();
}
GridviewEntity entity=list.get(position);
holder.titleview.setImageResource(entity.getDrawrouse());
holder.title.setText(entity.getTitle());
return convertView;
}
class ViewHolder{
public ImageView titleview;
public TextView title;
}
}
在此处有一个坑,就是如果把资源图片放在drawavle里面,再去实现setImageResourse运行就会报错:
表示不知道为什么(痛苦死了),以后如果用到了setImage的图片还是把它放在mipmap目录下吧:
总结:
简单实现了GridView布局,后面我会一个一个去填充子项的功能并已博客展示出来!(想写入更多功能奈何自己太菜~ _~)