2024年Android最新Android关于 ListView知识点,2024年最新网易测试面经

最后

针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

  • Android前沿技术大纲

  • 全套体系化高级架构视频

Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、混合式开发(ReactNative+Weex)全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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()-----------”);

T t = getItem(position);

convertView(convertView, t);

return convertView;

}

/**

  • 局部更新数据,调用一次getView()方法;Google推荐的做法

  • @param listView 要更新的listview

  • @param position 要更新的位置

*/

public void notifyDataSetChanged(ListView listView, int position) {

/第一个可见的位置/

int firstVisiblePosition = listView.getFirstVisiblePosition();

/最后一个可见的位置/

int lastVisiblePosition = listView.getLastVisiblePosition();

/在看见范围内才更新,不可见的滑动后自动会调用getView方法更新/

if (position >= firstVisiblePosition && position <= lastVisiblePosition) {

/获取指定位置view对象/

View view = listView.getChildAt(position - firstVisiblePosition);

getView(position, view, listView);

}

}

/**

  • 需要去实现的对item中的view的设置操作

  • @param item

  • @param t

*/

protected abstract void convertView(View item, T t);

}

我们每次更新的时候只需要调用notifyDataSetChanged(ListView listView, int position),传入对应的要更新的listview和要更新的位置position即可

三 ListView实现Item单选 多选效果

首先,在ListView的布局中设置了android:choiceMode属性后,item布局需要实现checkable,才有选中效果。

checkable接口:

/**

  • Defines an extension for views that make them checkable.

*/

public interface Checkable {

/**

  • 设置是否选中。

  • 当我们点击item的时候,

  • 会调用这个方法。

*/

void setChecked(boolean checked);

/**

*判断是否选中

*/

boolean isChecked();

/**

  • 如果当前是选中的状态,

  • 调用该方法后取消选中,

  • 反之,选中

*/

void toggle();

}

实现单选效果:

1、 ListView布局中android:choiceMode设置为singleChoice。

2、选取实现了checkable接口的View或者ViewGroup作为item布局控件。

当item展示的数据比较简单,例如就是一段文本,item布局可以直接使用系统自带的CheckedTextView控件,该控件有一个属性:android:checkMark=”?android:listChoiceIndicatorSingle”为单选样式;“?android:listChoiceIndicatorMultiple”为多选样式。若要修改显示的样式,可以自己写一个selector,然后checkMark指定为这个selector。例如:

在drawable文件夹下面创建一个ic_hideable_item.xml文件

checkMark指定为上面的那个xml文件:

<CheckedTextView xmlns:android=“http://schemas.android.com/apk/res/android”

android:id=“@+id/tv_single_choice”

android:layout_width=“match_parent”

android:layout_height=“?android:attr/listPreferredItemHeightSmall”

android:textSize=“14sp”

android:gravity=“center_vertical”

android:checkMark=“@drawable/ic_hideable_item”

android:paddingLeft=“16dp”

android:paddingRight=“16dp”>

写在最后

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从哪里入手去学习,对此我整理了一些资料

如果你熟练掌握以下列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包,最后觉得有帮助、有需要的朋友可以点个赞

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

al"

android:checkMark=“@drawable/ic_hideable_item”

android:paddingLeft=“16dp”

android:paddingRight=“16dp”>

写在最后

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从哪里入手去学习,对此我整理了一些资料

如果你熟练掌握以下列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包,最后觉得有帮助、有需要的朋友可以点个赞

[外链图片转存中…(img-ehNZQrUN-1715710478810)]

[外链图片转存中…(img-CyxOSJMr-1715710478811)]

[外链图片转存中…(img-og4bl04Q-1715710478811)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值