Android学习-listview

  • ListView简单用法

布局中添加listview设置id,在活动中使用

ArrayAdapter<String> adapter = new ArrayAdapter<String>(当前活动.this,布局id,data)
//data需要自己设置,可以设置String[] data = {"bulabula",....};
ListView listview = (ListView) findViewById(R.id.(你设置的id));
listview.setAdapter(adapter);
  • 自定义ListView

比如想要实现任务列表

  • 我们需要自定义适配器TaskAdapter,传递的数据类型为Task,那我们需要定义Task类.
//name表示任务名称,imageId表示水果对应图片的资源id。
public class Task {
    
    
        private String name;
        private int imageId;

    public Task(String name, int imageId) {
    
    
        this.name = name;
        this.imageId = imageId;
    }

    public int getImageId() {
    
    
        return imageId;
    }

    public String getName() {
    
    
        return name;
    }
}
  • 然后需要listview的子项指定一个我们自定义的布局,新建task_item.
public class TaskCenterActivity_2 extends AppCompatActivity {
    private List<Task> taskList = new ArrayList<>();
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.taskcenter_listview);
        initTask();
        TaskAdapter taskAdapter = new TaskAdapter(TaskCenterActivity_2.this,R.layout.task_item,taskList);
        ListView listView = (ListView) findViewById(R.id.list_view);
        listView.setAdapter(taskAdapter);
    }
    private void initTask(){
        for (int i = 0;i<=20; i++){
            Task task1 = new Task("啦啦啦",R.drawable.ic_launcher_background);
            taskList.add(task1);
        }
    }
}
  • 接下来需要创建一个自定义的适配器,这个适配器继承自ArrayAdapter,并将泛型指定为Task类新建类TaskAdapter

public class TaskAdapter extends ArrayAdapter<Task> {
    
    
    private int resourceId;

    public TaskAdapter(@NonNull Context context,int textViewResourceId, @NonNull List<Task> objects) {
    
    
        super(context, textViewResourceId, objects);
        resourceId = textViewResourceId;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    
    
        Task task = getItem(position);//获取当前项的Task实例
        View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
        ImageView taskImage = (ImageView) view.findViewById(R.id.task_image);
        TextView taskName = (TextView) view.findViewById(R.id.task_name);
        taskImage.setImageResource(task.getImageId());
        taskName.setText(task.getName());
        return view;
    }
    }
/*TaskAdapter重写了父类方法的一组构造函数,用于将上下文、ListView子项布局的id和数据都传递进来。另外又重写了getView()方法,这个方法在每个子项被滚动到屏幕内的
时候会被调用。在getView方法中,首先通过getitem方法得到当前项的task实例,然后使用Layoutinflater来为这个子项加载我们传入的布局。里面的参数 parent ,false着两
个参数的含义,第一个,毋庸置疑,就是这个布局放在哪儿。就是这个parent这个fasle 所对应的参数,源码里面是这么说的  Whether the inflated hierarchy should be
attached to the root parameter? If false, root is only used to create the correct subclass of LayoutParams for the root view in the XML.google了
一下,膨胀的层次结构是否应该附加到根参数? 如果为false,则root仅用于为XML中的根视图创建LayoutParams的正确子类。意思就是这个你在子布局中设置的属性是否添加到
parent,如果设置为fasle,就是你在xml中设置的样子。(初步理解)

书中关于inflate方法原话:第三个参数指定为false,表示只让我们在父布局中声明的layout属性生效,但不为这个View添加父布局,因为一旦View有了父布局之后,他就不能再添加到
ListView中了。如果你现在还不能理解这段发的含义也没管辖,只需要知道这是ListView的标准写法就可以了,日后深入再看即可。

LayoutInflater.from的含义
通俗的说,inflate就相当于将一个xml中定义的布局找出来. 因为在一个Activity里如果直接用findViewById()的话,对应的是setConentView()的那个layout里的组件.
因此如果你的Activity里如果用到别的layout,比如对话框上的layout,你还要设置对话框上的layout里的组件(像图片
ImageView,文字TextView)上的内容,你就必须用inflate()先将对话框上的layout找出来,然后再用这个layout对象去
找到它上面的组件,如: View view = View.inflate(this, R.layout.dialog_layout,
null); TextView dialogTV = (TextView)
view.findViewById(R.id.dialog_tv); dialogTV.setText(“abcd”);
如果组件R.id.dialog_tv是对话框上的组件,而你直接用this.findViewById(R.id.dialog_tv)肯定会报错.
LayoutInflater:将布局XML文件实例化为其对应的View 对象。它永远不会直接使用。相反,使用
getLayoutInflater()或 getSystemService(String)检索已连接到当前上下文并
为正在运行的设备正确配置的标准LayoutInflater实例。

  • 继续往下,调用view的findviewbyid方法分别获取两个控件的实例,调用setimageresource和settext方法来设置图片和文字,最后将布局返回,这样自定义的适配器就完成了。
  • 下面修改活动中的代码
public class TaskCenterActivity_2 extends AppCompatActivity {
    
    
    private List<Task> taskList = new ArrayList<>();
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.taskcenter_listview);
        initTask();
        TaskAdapter taskAdapter = new TaskAdapter(TaskCenterActivity_2.this,R.layout.task_item,taskList);
        ListView listView = (ListView) findViewById(R.id.list_view);
        listView.setAdapter(taskAdapter);
    }
    private void initTask(){
    
    
        for (int i = 0;i<=20; i++){
    
    
            Task task1 = new Task("啦啦啦",R.drawable.ic_launcher_background);
            taskList.add(task1);
        }
    }
}

完成啦!

猜你喜欢

转载自blog.csdn.net/vbbbbbbbbbbb/article/details/113405912