import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private String[] names=new String[]{“Lion”,“Tiger”,“Monkey”,“Dog”,“Cat”,“elephant”};
private int[] image=new int[]{R.drawable.lion,R.drawable.tiger,R.drawable.monkey,R.drawable.dog ,R.drawable.cat,R.drawable.elephant};
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE); //设置当前的Activity无Title并且全屏
setContentView(R.layout.main); //所在的Activity采用R.layout下的main布局文件进行布局
final int color1=0xFFC5B5FF;
final int color2=0xFFFFFFFF;
//创建一个list集合,list集合的元素是Map
List<Map<String,Object>> ListItems=new ArrayList<Map<String, Object>>();
for(int i=0;i<names.length;i++){
Map<String,Object> listItem=new HashMap<String,Object>();
listItem.put(“header”,names[i]);
listItem.put(“images”,image[i]);
ListItems.add(listItem); //加入list集合
}
//创建一个SimpleAdapter,因为在使用ListView时需要进行数据适配
SimpleAdapter simpleAdapter=new SimpleAdapter(this,ListItems,R.layout.simple_items,new String[]{“header”,“images”},new int[]{R.id.header,R.id.images});
final ListView list=(ListView)findViewById(R.id.mylist);
//为ListView设置Adapter
list.setAdapter(simpleAdapter);
list.setOnItemClickListener(new AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView<?> parent,View view,int position,long id){
int flag=0;
System.out.println(names[position]+position+“被单击”);
switch (flag){
case 0:
view.setSelected(true);
CharSequence text=names[position];
int duration=Toast.LENGTH_SHORT;
Toast toast=Toast.makeText(MainActivity.this,text,duration);
toast.show();
flag=1;
break;
case 1:
view.setBackgroundColor(color2);
view.setSelected(false);
CharSequence text1=names[position];
int duration1=Toast.LENGTH_SHORT;
Toast toast1=Toast.makeText(MainActivity.this,text1,duration1);
toast1.show();
flag=0;
break;
}
}
});
list.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){
public void onItemSelected(AdapterView<?> parent, View view, int position, long id){
System.out.println(names[position]+“选中”);
}
public void onNothingSelected(AdapterView<?> parent){
}
});
}
}
二. ListView局部刷新
对ListView有了基本的了解,了解到在Android开发中我们经常会用到listview的数据和界面刷新动作,我们基本上用到的都是Adapter.notifyDataSetChanged()方法。这个方法的原理是利用观察者模式对我们的数据源进行监听,当我们的数据源发生变化的时候,会调用Adapter的getView()方法进行整个界面的刷新。getview()会调用多次,刷新了好多个不需要刷新的item,这样的话相对而言,降低了效率。但是,我们有的情况下是只需要对某个item的数据进行刷新就可以了。如点击下图中的任一条目可以实现局部刷新,而不会全部刷新。
1.ListView实现局部刷新方法一: 更的新对应view的内容 这种方法先通过listView.getChild(position)拿到要更新的对应的item布局文件,然后再通过findViewById找到对应的控件进行设置。
package cn.bluemobi.dylan.listviewupdate;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import cn.bluemobi.dylan.listviewupdate.adapter.CommonAdapter;
import cn.bluemobi.dylan.listviewupdate.adapter.CommonViewHolder;
public class MainActivity extends AppCompatActivity {
private ListView listView;
private List datas;
private CommonAdapter commonAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
updateOneTest();
}
/**
- 只是局部更新某个界面
*/
private void updateOneTest() {
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listview);
datas = new ArrayList<>();
for (int i = 0; i < 20; i++) {
datas.add(“万能适配器测试” + i);
}
commonAdapter = new CommonAdapter(this, datas, R.layout.item) {
@Override
protected void convertView(View item, String s) {
TextView textView = CommonViewHolder.get(item, R.id.textView);
textView.setText(s);
}
};
listView.setAdapter(commonAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
datas.set(position, “update 万能适配器测试” + position);
updateSingle(position);
}
});
}
/**
-
第一种方法 更新对应view的内容
-
@param position 要更新的位置
*/
private void updateSingle(int position) {
/第一个可见的位置/
int firstVisiblePosition = listView.getFirstVisiblePosition();
/最后一个可见的位置/
int lastVisiblePosition = listView.getLastVisiblePosition();
/在看见范围内才更新,不可见的滑动后自动会调用getView方法更新/
if (position >= firstVisiblePosition && position <= lastVisiblePosition) {
/获取指定位置view对象/
View view = listView.getChildAt(position - firstVisiblePosition);
TextView textView = (TextView) view.findViewById(R.id.textView);
textView.setText(datas.get(position));
}
}
}
2.ListView实现局部刷新方法二: 调用一次getView()方法
这种方法是调用适配器对应的getView方法,用它里面的代码对界面进行刷新。
package cn.bluemobi.dylan.listviewupdate;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import cn.bluemobi.dylan.listviewupdate.adapter.CommonAdapter;
import cn.bluemobi.dylan.listviewupdate.adapter.CommonViewHolder;
public class MainActivity extends AppCompatActivity {
private ListView listView;
private List datas;
private CommonAdapter commonAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
updateOneTest();
}
/**
- 只是局部更新某个界面
*/
private void updateOneTest() {
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listview);
datas = new ArrayList<>();
for (int i = 0; i < 20; i++) {
datas.add(“万能适配器测试” + i);
}
commonAdapter = new CommonAdapter(this, datas, R.layout.item) {
@Override
protected void convertView(View item, String s) {
TextView textView = CommonViewHolder.get(item, R.id.textView);
textView.setText(s);
}
};
listView.setAdapter(commonAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
datas.set(position, “update 万能适配器测试” + position);
updateItem(position);
}
});
}
/**
-
第二种方法 调用一次getView()方法;
-
Google推荐的做法
-
@param position 要更新的位置
*/
private void updateItem(int position) {
/第一个可见的位置/
int firstVisiblePosition = listView.getFirstVisiblePosition();
/最后一个可见的位置/
int lastVisiblePosition = listView.getLastVisiblePosition();
/在看见范围内才更新,不可见的滑动后自动会调用getView方法更新/
if (position >= firstVisiblePosition && position <= lastVisiblePosition) {
/获取指定位置view对象/
View view = listView.getChildAt(position - firstVisiblePosition);
commonAdapter.getView(position, view, listView);
}
}
}
最后封装在万能适配器当中
package cn.bluemobi.dylan.listviewupdate.adapter;
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.ListView;
import java.util.List;
/**
-
Created by yuandl on 2016-10-13.
-
万能适配器
*/
public abstract class CommonAdapter extends BaseAdapter {
private Context context;
private List datas;
private int layoutId;
public CommonAdapter(Context context, List datas, int layoutId) {
this.context = context;
this.datas = datas;
this.layoutId = layoutId;
}
@Override
public int getCount() {
return datas == null ? 0 : datas.size();
}
@Override
public T getItem(int position) {
return datas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(layoutId, null);
}
Log.d(“listview”, “---------getView()-----------”);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip204888 备注Android获取(资料价值较高,非无偿)
最后
在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!**
[外链图片转存中…(img-TpCJ3GLF-1711548278474)]
[外链图片转存中…(img-hgpvcYOV-1711548278475)]
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip204888 备注Android获取(资料价值较高,非无偿)
[外链图片转存中…(img-1WTCsHAS-1711548278476)]
最后
在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-LHNPZWYg-1711548278477)]