朱建良 發表於 2020-6-14 11:43:00

android开发-java

<p>环境篇【】</p>
<p>初始化环境可以看看这里http://c.biancheng.net/view/2899.html</p>
<p>我就只提出我遇到的问题</p>
<p><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614075712667-45112563.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;尝试 ,没用</p>
<p>后发现代理问题</p>
<p><span style="font-family: 宋体">打开</span>C:\Users\E\.gradle<span style="font-family: 宋体">下面的</span><span style="font-family: Verdana">gradle.properties</span><span style="font-family: 宋体">文件: </span><span style="font-family: Verdana">systemProp.https.proxyPort=80 systemProp.http.proxyHost=mirrors.neusoft.edu.cn systemProp.https.proxyHost=mirrors.neusoft.edu.cn systemProp.http.proxyPort=80 </span><span style="font-family: 宋体">原来我之前设置过代理。全部注释掉!</span></p>
<p>&nbsp;</p>
<p>依赖慢的话就</p>
<p>&nbsp;</p>
<p class="pre">// &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mavenCentral()// &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jcenter()// &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;google()</p>
<p>&nbsp;</p>
<p class="pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maven {&nbsp;url 'https://maven.aliyun.com/repository/gradle-plugin' }</p>
<p>&nbsp;</p>
<p class="pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maven {&nbsp;url 'https://maven.aliyun.com/repository/google' }</p>
<p>&nbsp;</p>
<p class="pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maven {&nbsp;url 'http://maven.aliyun.com/nexus/content/groups/public/' }</p>
<p>&nbsp;</p>
<p class="pre">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maven {&nbsp;url 'https://maven.aliyun.com/repository/jcenter'}</p>
<p class="pre">建议多看看官方给出的代码:https://developer.android.google.cn/samples?language=java</p>
<p class="pre">看看基础:http://c.biancheng.net/android/</p>
<p class="pre">以下是我ode学习总结</p>
<p>&nbsp;</p>
<p align="justify">java<span style="font-family: 宋体">先定义再声明,利用</span><span style="font-family: Calibri">findViewById</span><span style="font-family: 宋体">找到按钮的</span><span style="font-family: Calibri">id</span><span style="font-family: 宋体">值再强制转换类型,过后设置方法</span><span style="font-family: Calibri">onclick</span></p>
<p align="justify"><span style="font-family: 宋体">这样就可以通过不同的</span>btn_id<span style="font-family: 宋体">来跳转不同的页面</span></p>
<p align="justify">&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> MainActivity <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> AppCompatActivity {
    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onCreate(Bundle savedInstanceState) {
      </span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      Button btn </span>= (Button) <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.findViewById(R.id.button1);
      btn.setOnClickListener(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> View.OnClickListener() {
            @Override
            </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onClick(View v) {
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">TODO Auto-generated method stub</span>
                setTitle("button1 被用户点击了"<span style="color: rgba(0, 0, 0, 1)">);
                Log.i(</span>"widgetDemo", "button1 被用户点击了。"<span style="color: rgba(0, 0, 0, 1)">);
            }
      });
    }
}</span></pre>
</div>
<p align="justify">&nbsp;</p>
<p>多个时</p>
<p align="justify">&nbsp;</p>
<p align="justify"><span style="font-family: 宋体"><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614083025414-1497294361.png" alt="" loading="lazy"></span></p>
<p>&nbsp;</p>
<p align="justify">&nbsp;</p>
<p><span style="font-family: 宋体">这里的OnClick就是一个listener的名字而已,主要是实现view.onclickListener的onclick方法</span></p>
<p align="justify">&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">intent的参数.class这个就是java的类,在kotlin里也是一样的这样写.class,即activity本就是java的类。&nbsp;</span></span></p>
<p align="justify">&nbsp;</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614083418092-135041114.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;然后就是一些基本常见的组件和GUI的开发步骤</p>
<p>难点是适配器</p>
<p>&nbsp;</p>
<p class="p"><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614215233752-776865191.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614215240565-1774962549.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="p"><span>https://www.jianshu.com/p/4e8e4fd13cf7</span>详细出自这</p>
<p class="p"><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614215340662-203756225.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<ul>
<li>ListView仅作为容器(列表),用于装载&nbsp;&amp;&nbsp;显示数据(即 列表项Item)</li>
<li>而容器内的具体数据(列表项Item)则是由&nbsp;适配器(Adapter)提供</li>

</ul>
<p class="p">适配器(Adapter):作为View&nbsp;和&nbsp;数据之间的桥梁&nbsp;&amp; 中介,将数据映射到要展示的View中</p>
<ul>
<li>当需显示数据时,ListView会向Adapter取出数据,从而加载显示,具体如下图</li>

</ul>
<p class="p"><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614215405368-2057337837.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="p">试想一个场景:若把所有数据集合的信息都加载到ListView上显示,若&nbsp;ListView要为每个数据都创建一个视图,那么会占用非常多的内存</p>
<p class="p">为了节省空间和时间,ListView不会为每一个数据创建一个视图,而是采用了<strong>Recycler组件</strong>,用于回收&nbsp;&amp;&nbsp;复用&nbsp;View</p>
<p class="p">当屏幕需显示x个Item时,那么ListView会创建&nbsp;x+1个视图;当第1个Item离开屏幕时,此Item的View被回收至缓存,入屏的Item的View会优先从该缓存中获取</p>
<p class="p">注:</p>
<ol>
<li>只有Item完全离开屏幕后才可复用,这也是为什么ListView要创建比屏幕需显示视图多1个的原因:缓冲 显示视图</li>
<li>即:第1个Item离开屏幕是有过程的,会有1个&nbsp;<strong>第1个</strong>Item<strong>的下半部分&nbsp;&amp; 第8个</strong>Item<strong>上半部分同时在屏幕中显示</strong>的状态,此时仍无法使用缓存的View,只能继续用新创建的视图View</li>

</ol>
<p class="p">&nbsp;</p>
<p class="p"><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614215500581-747834527.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="p">而这个重写的方法参数中第一个参数有一个parent</p>
<p class="p">position是指当前dataset的位置,通过getCount和getItem来使用。如果list向下滑动的话那么就是最低端的item的位置,如果是向上滑动的话那就是最上端的item的位置。conert是指可以重用的视图,即刚刚出队的视图。</p>
<p class="p">而parent应该就是list。</p>
<p class="p">parent:parent相当于listview适配器的一个指针,可以通过它来获得listview里装着的一切东西,简单说就是所使用的list容器,例如ListView、GridView。通过强制类型转换可以将parent转换为对应的list容器。然后通过转换得到的list对象调用getAdapter()方法获得适配对象,通过适配对象就可以获得所展示的每一项的对象model。</p>
<p>例:ListView listView = (ListView) parent;</p>
<p>ListAdapter listAdapter = listView.getAdapter();</p>
<p class="p">&nbsp;</p>
<p class="p">而简单的view是你点的b这个view的句柄,就是你可以用这个view,来获得b里的控件的id后操作控件。就是可以使用&nbsp;view.findViewById()方法来获取所点击item中的控件</p>
<p class="p">&nbsp;</p>
<p class="p">&nbsp;</p>
<p>接上</p>
<p align="justify"><span style="font-family: 宋体">在</span>activity<span style="font-family: 宋体">里,找到想使用的</span><span style="font-family: Calibri">id</span><span style="font-family: 宋体">并需要转类型,此时的</span><span style="font-family: Calibri">mLv1</span><span style="font-family: 宋体">就是一个</span><span style="font-family: Calibri">listview</span><span style="font-family: 宋体">了</span></p>
<p align="justify"><span style="font-family: 宋体">写出</span>mLv1.<span style="font-family: 宋体">点就能看到里面 有哪些方法,其中就有经常用的</span><span style="font-family: Calibri">setAdapter</span><span style="font-family: 宋体">方法,并且可以看到方法参数为</span><span style="font-family: Calibri">adapter</span><span style="font-family: 宋体">,所以可以就可以在另一个</span><span style="font-family: Calibri">class</span><span style="font-family: 宋体">中再写一个</span><span style="font-family: Calibri">adapter</span></p>
<p><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614105942674-674460450.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p align="justify"><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614110018924-2038977713.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p align="justify"><span style="font-family: 宋体">在同包的下面另一个</span>class<span style="font-family: 宋体">中再写一个</span><span style="font-family: Calibri">adapter</span><span style="font-family: 宋体">,继承</span><span style="font-family: Calibri">baseadapter</span><span style="font-family: 宋体">即可,先学这个基础的,</span></p>
<p align="justify">BaseAdapter<span style="font-family: 宋体">就</span><span style="font-family: Calibri">Android</span><span style="font-family: 宋体">应用程序中经常用到的基础数据适配器,它的主要用途是将一组数据传到像</span><span style="font-family: Calibri">ListView</span><span style="font-family: 宋体">、</span><span style="font-family: Calibri">Spinner</span><span style="font-family: 宋体">、</span><span style="font-family: Calibri">Gallery</span><span style="font-family: 宋体">及</span><span style="font-family: Calibri">GridView</span><span style="font-family: 宋体">等</span><span style="font-family: Calibri">UI</span><span style="font-family: 宋体">显示组件,</span></p>
<p align="justify"><span style="font-family: 宋体">它是继承自接口类</span><span style="font-family: Calibri">Adapter</span><span style="font-family: 宋体">,我们经常使用的</span><span style="font-family: Calibri">ListView </span><span style="font-family: 宋体">的</span><span style="font-family: Calibri">adapter</span><span style="font-family: 宋体">,即</span><span style="font-family: Calibri">SimpleAdapter</span><span style="font-family: 宋体">,是继承自</span><span style="font-family: Calibri">BaseAdapter</span><span style="font-family: 宋体">的,</span><span style="font-family: Calibri">BaseAdapter</span><span style="font-family: 宋体">是一个基类,没有实现绑定数据的功能,</span></p>
<p align="justify"><span style="font-family: Calibri">SimpleAdapter</span><span style="font-family: 宋体">实现了基本控件的绑定,如</span><span style="font-family: Calibri">TextView,Button,ImageView).</span><span style="font-family: 宋体">已经为我们实现好了数据优化工作,这些适配器使用相同组件动态绑定数据的方式进行优化。</span></p>
<p align="justify"><span style="font-family: 宋体">使用</span>BaseAdapter<span style="font-family: 宋体">的话需要重载四个方法,这些方法分别是</span><span style="font-family: Calibri">getCount</span><span style="font-family: 宋体">,</span><span style="font-family: Calibri">getItem</span><span style="font-family: 宋体">,</span><span style="font-family: Calibri">getItemId</span><span style="font-family: 宋体">,最后一个最重要的是</span><span style="font-family: Calibri">getView</span><span style="font-family: 宋体">,</span><span style="font-family: Calibri">getView</span><span style="font-family: 宋体">函数为什么重要呢?</span></p>
<p align="justify"><span style="font-family: 宋体">因为它是用来刷新它所在的</span><span style="font-family: Calibri">ListView</span><span style="font-family: 宋体">的。它在什么时候调用的呢?就是在每一次</span><span style="font-family: Calibri">item</span><span style="font-family: 宋体">从屏幕外滑进屏幕内的时候,或者程序刚开始的时候创建第一屏</span><span style="font-family: Calibri">item</span><span style="font-family: 宋体">的时候。</span></p>
<p align="justify">&nbsp;</p>
<p class="p" align="justify">&nbsp;<img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614110135737-1187847860.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p align="justify"><span style="font-family: 宋体">还可以点击</span>baseAdapter<span style="font-family: 宋体">看看里面的方法,方便我们重写,因为继承嘛</span></p>
<p align="justify"><span style="font-family: 宋体">点击他然后</span>ctrl+<span style="font-family: 宋体">鼠标左键还是右键点击进去,</span></p>
<p align="justify"><span style="font-family: 宋体"><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614110253980-1739405268.png" alt="" loading="lazy"></span></p>
<p>&nbsp;</p>
<p align="justify">&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">再点</span> <span style="font-family: 宋体">接口</span>implements&nbsp;<span style="font-family: 微软雅黑">里的一些接口进去到看到</span>Adapter类的基本方法</p>
<p><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614110317708-2093157079.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="p">extends 是继承某个类, 继承之后可以使用父类的方法, 也<strong><span class="15"><span style="font-family: 微软雅黑">可以重写父类的方法</span></span></strong>;&nbsp;implements 是实现多个接口,<strong><span class="15">&nbsp;接口的方法一般为空的, 必须重写才能使用&nbsp;</span></strong><strong><span class="15"><span style="font-family: 微软雅黑">)</span></span></strong></p>
<p class="p"><strong><span class="15">&nbsp;</span></strong>extends是继承父类,只要那个类<strong><span class="15"><span style="font-family: 微软雅黑">不是声明为</span>final或者那个类定义为abstract</span></strong><span style="font-family: 微软雅黑">的就能继承也可以调用父类初始化</span> this.parent()。而且会覆盖父类定义的变量或者函数。</p>
<p class="p">这样的好处是:架构师定义好接口,让工程师实现就可以了。整个项目开发效率和开发成本大大降低。 &nbsp;</p>
<p class="p">&nbsp;implements,实现父类,子类不可以覆盖父类的方法或者变量。即使子类定义与父类相同的变量或者函数,也会被父类取代掉。&nbsp;&nbsp;</p>
<p class="p"><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614110424355-89545504.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p align="justify"><span style="font-family: 宋体">点击继承</span> <span style="font-family: 宋体">实现</span>implement<span style="font-family: 宋体">接口方法就会</span><span style="font-family: Calibri">@Override</span><span style="font-family: 宋体">几个方法</span></p>
<p align="justify">然后写一个构造方法传参</p>
<p align="justify"><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614110438923-381534233.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p align="justify">LayoutInflater--<span style="font-family: 宋体">(</span><span style="font-family: 宋体">相信接触</span>Android<span style="font-family: 宋体">久一点的朋友对于</span><span style="font-family: Calibri">LayoutInflater</span><span style="font-family: 宋体">一定不会陌生,都会知道它主要是用于加载布局的。而刚接触</span><span style="font-family: Calibri">Android</span><span style="font-family: 宋体">的朋友可能对</span><span style="font-family: Calibri">LayoutInflater</span><span style="font-family: 宋体">不怎么熟悉,</span></p>
<p align="justify"><span style="font-family: 宋体">因为加载布局的任务</span><span style="font-family: 宋体">通常都是在</span>Activity中调用setContentView()方法来完成的。其实setContentView()方法的内部也是使用LayoutInflater来加载布局的,</p>
<p align="justify">只不过这部分源码是internal的,不太容易查看到。<strong><span style="font-family: 宋体">它的作用类似于</span>findViewById()。</strong></p>
<p align="justify"><strong>不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;</strong></p>
<p align="justify"><strong>而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。</strong><strong><span style="font-family: 宋体">)</span></strong></p>
<p align="justify"><strong><span style="font-family: 宋体">如何调用在下面</span> <span style="font-family: 宋体">,现在只是声明。</span></strong></p>
<p align="justify">&nbsp;</p>
<p align="justify"><span style="font-family: 宋体">而</span>context</p>
<p align="justify"><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614110552351-182373431.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">那</span>Context到底是什么呢?一个Activity就是一个Context,一个Service也是一个Context。Android程序员把“场景”抽象为Context类,他们认为用户和操作系统的每一次交互都是一个场景,</p>
<p class="p"><strong><span style="font-family: 宋体">生动形象的理解</span>Context(来自网络)</strong></p>
<p class="p"><span style="font-family: 宋体">上面的概念中采用了通俗的理解方式,将</span>Context<span style="font-family: 宋体">理解为</span><span style="font-family: Calibri">“</span><span style="font-family: 宋体">上下文</span><span style="font-family: Calibri">”</span><span style="font-family: 宋体">或者</span><span style="font-family: Calibri">“</span><span style="font-family: 宋体">场景</span><span style="font-family: Calibri">”</span><span style="font-family: 宋体">,如果你仍然觉得很抽象,不好理解。在这里给出一个可能不是很恰当的比喻,希望有助于大家的理解:</span></p>
<p class="p"><span style="font-family: 宋体">一个</span><span style="font-family: Calibri">Android</span><span style="font-family: 宋体">应用程序,可以理解为一部电影或者一部电视剧,</span><span style="font-family: Calibri">Activity</span><span style="font-family: 宋体">,</span><span style="font-family: Calibri">Service</span><span style="font-family: 宋体">,</span><span style="font-family: Calibri">Broadcast Receiver</span><span style="font-family: 宋体">,</span><span style="font-family: Calibri">Content Provider</span><span style="font-family: 宋体">这四大组件就好比是这部戏里的四个主角:胡歌,霍建华,诗诗,</span><span style="font-family: Calibri">Baby</span><span style="font-family: 宋体">。</span></p>
<p class="p"><span style="font-family: 宋体">他们是由剧组(系统)一开始就定好了的,整部戏就是由这四位主演领衔担纲的,所以这四位主角并不是大街上随随便便拉个人(</span><span style="font-family: Calibri">new </span><span style="font-family: 宋体">一个对象)都能演的。</span></p>
<p class="p"><span style="font-family: 宋体">有了演员当然也得有摄像机拍摄啊,他们必须通过镜头(</span><span style="font-family: Calibri">Context</span><span style="font-family: 宋体">)才能将戏传递给观众,这也就正对应说四大组件(四位主角)必须工作在</span><span style="font-family: Calibri">Context</span><span style="font-family: 宋体">环境下(摄像机镜头)。</span></p>
<p class="p"><span style="font-family: 宋体">那</span><span style="font-family: Calibri">Button</span><span style="font-family: 宋体">,</span><span style="font-family: Calibri">TextView</span><span style="font-family: 宋体">,</span><span style="font-family: Calibri">LinearLayout</span><span style="font-family: 宋体">这些控件呢,就好比是这部戏里的配角或者说群众演员,他们显然没有这么重用,随便一个路人甲路人乙都能演(可以</span><span style="font-family: Calibri">new</span><span style="font-family: 宋体">一个对象),</span></p>
<p class="p"><span style="font-family: 宋体">但是他们也必须要面对镜头(工作在</span><span style="font-family: Calibri">Context</span><span style="font-family: 宋体">环境下),所以</span>Button mButton=new Button<span style="font-family: 宋体">(</span><span style="font-family: &quot;Courier New&quot;">Context</span><span style="font-family: 宋体">)</span><span style="font-family: 宋体">是可以的。虽然不很恰当,但还是很容易理解的,希望有帮助。</span></p>
<p class="p">&nbsp;</p>
<p class="p"><span style="font-family: 宋体">助。</span></p>
<p class="p">&nbsp;</p>
<p class="p"><span style="font-family: 宋体">理解完上述之后</span> <span style="font-family: 宋体">重写</span>ovrrid<span style="font-family: 宋体">方法,其他可以不写,但写一个方便理解</span></p>
<p class="p">&nbsp;</p>
<p class="p"><span style="font-family: 宋体">如</span>getcoun<span style="font-family: 宋体">方法</span><span style="font-family: Calibri">t</span><span style="font-family: 宋体">写一个 </span><span style="font-family: Calibri">return 10</span></p>
<p class="p">&nbsp;</p>
<p class="p"><span style="font-family: 宋体">重点重写的</span>getview<span style="font-family: 宋体">方法</span></p>
<p class="p"><span style="font-family: 宋体"><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614110944904-1574391801.png" alt="" loading="lazy"></span></p>
<p><span style="font-family: 宋体">首先参数里就知道需要一个</span>view converview<span style="font-family: 宋体">,</span></p>
<p><span style="font-family: 宋体">(</span></p>
<pre class="best-text mb-10">这个convertView其实就是最关键的部分原理上讲 当ListView滑动的过程中 会有item被滑出屏幕 而不再被使用 <br>这时候Android会回收这个条目的view 这个view也就是这里的convertView<br><br>当item1被移除屏幕的时候 我们会重新new一个View给新显示的item_new <br>而如果使用了这个convertView 我们其实可以复用它 这样就省去了new View的大量开销</pre>
<p><span style="font-family: 宋体">)</span></p>
<p><span style="font-family: 宋体">所以就用到了</span><span style="font-family: &quot;Times New Roman&quot;">layoutInflater</span><span style="font-family: 宋体">的</span><span style="font-family: &quot;Times New Roman&quot;">inflate</span><span style="font-family: 宋体">加载这个</span><span style="font-family: &quot;Times New Roman&quot;">layout</span><span style="font-family: 宋体">即</span><span style="font-family: &quot;Times New Roman&quot;">xml(才能实现这个view即view converview)</span><span style="font-family: 宋体">。然后就可以一个一个找到里面的</span><span style="font-family: &quot;Times New Roman&quot;">id</span><span style="font-family: 宋体">赋给对应的初始值</span><span style="font-family: &quot;Times New Roman&quot;">holder</span><span style="font-family: 宋体">, </span></p>
<p><span style="font-family: 宋体">然后传给</span><span style="font-family: &quot;Times New Roman&quot;">convertview</span><span style="font-family: 宋体">。 这个类</span><span style="font-family: &quot;Times New Roman&quot;">myadapter</span><span style="font-family: 宋体">就写完了</span></p>
<p><span style="font-family: 宋体"><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614111510663-842572076.png" alt="" loading="lazy"></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="p"><span style="font-family: 宋体">当然还可以选择自己赋值,看选可不选,不选的话就是加载</span>xml layout<span style="font-family: 宋体">里面的</span></p>
<p class="p">text<span style="font-family: 宋体">这些。</span></p>
<p><span style="font-family: 宋体">然后回到</span>listviewActivity<span style="font-family: 宋体">里的</span><span style="font-family: Calibri">oncreat</span><span style="font-family: 宋体">里使用方法并传参这个自己写的类</span></p>
<p><span style="font-family: 宋体"><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614111600136-908113800.png" alt="" loading="lazy"></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="p"><span style="font-family: 宋体">发现提示我们需要</span>context(<span style="font-family: 宋体">因为我的类写了一个构造函数传参</span><span style="font-family: Calibri">)</span><span style="font-family: 宋体">。再结合我们上面的</span><span style="font-family: Calibri">context</span><span style="font-family: 宋体">解析可以理解应该这样</span></p>
<p class="p"><span style="font-family: 宋体"><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614111754225-1901007938.png" alt="" loading="lazy"></span></p>
<p>&nbsp;</p>
<p class="p"><span style="font-family: 宋体">发现可以拖动,有</span>10<span style="font-family: 宋体">行 ,因为设置的</span><span style="font-family: Calibri">count </span><span style="font-family: 宋体">为</span><span style="font-family: Calibri">10</span></p>
<p class="p"><span style="font-family: 宋体">在这里我们并没有设置</span>listview<span style="font-family: 宋体">的</span><span style="font-family: Calibri">item</span><span style="font-family: 宋体">等其他方法所以</span><span style="font-family: Calibri">10</span><span style="font-family: 宋体">个全是一样的</span></p>
<p class="p"><span style="font-family: 宋体"><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614214934881-106661430.png" alt="" loading="lazy"></span></p>
<p>&nbsp;</p>
<p class="p"><span style="font-family: 宋体"></span></p>
<p>&nbsp;</p>
<p class="p"><span style="font-family: 宋体">其实在这里是可以看到的</span>Listview<span style="font-family: 宋体">有</span><span style="font-family: Calibri">item1 2 3</span><span style="font-family: 宋体">等,在</span><span style="font-family: Calibri">getItem</span><span style="font-family: 宋体">方法可以重写,并且点击第几时又跳转到哪这些又需要一些新函数,如</span></p>
<p class="p">listView.setOnItemClickListener(new OnItemClickListener(){</p>
<p class="p">@Override</p>
<p class="p">public void onItemClick(AdapterView&lt;?&gt; parent, View view,</p>
<p class="p">int position, long id) {</p>
<p class="p">这些方法</p>
<p class="p">也可以这样写</p>
<p class="p"><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614215022883-2009994200.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="p">定义列表数组资源作为列表各项</p>
<p class="p"><span style="font-family: 宋体">然后添加到</span>listView<span style="font-family: 宋体">的</span><span style="font-family: Calibri">entries</span><span style="font-family: 宋体">中,图中可以看到已经加载为</span><span style="font-family: Calibri">@array/options</span></p>
<p class="p"><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614215043189-606979232.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>然后添加单击事件相应,</p>
<p class="p">&nbsp;</p>
<p class="p">&nbsp;</p>
<p>&nbsp;再看看RecylerView_java项目(全为各种adapter的演示)</p>
<p><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614112545587-1419471652.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="p">&nbsp;</p>
<p class="p"><span style="font-family: 宋体">这里面需要注意就是</span></p>
<p class="p">&nbsp;</p>
<p>首先是recyclerview的配置问题,recyclerview是要导入android.support.v7.widget.RecyclerView的包。还要在Gradle Scripts中添加 compile ‘com.android.support:recyclerview-v7:23.4.0’,然后同步。 <br>2.使用RecyclerView实现的主要是内容是Item的添加和删除以及ListView,GridView和瀑布流的切换,还有就是Item的长按和短按的点击事件。</p>
<p class="p">&nbsp;</p>
<p>ListView和GridView的切换还是很好用,代码也很简单。主要是实现了以下代码。</p>
<p class="p">&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
*这是ListView的效果
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
recyclerView.setLayoutManager(</span><span style="color: rgba(0, 0, 255, 1)">new</span> LinearLayoutManager(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">));

</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
*这是GridView的效果
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
recyclerView.setLayoutManager(</span><span style="color: rgba(0, 0, 255, 1)">new</span> GridLayoutManager(<span style="color: rgba(0, 0, 255, 1)">this</span>, 2));</pre>
</div>
<p>只需要改一行代码就能实现GridView和ListView的切换!! <br><br></p>
<p class="p">&nbsp;看一下这里的一个adapter</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> linearAdapter <span style="color: rgba(0, 0, 255, 1)">extends</span> RecyclerView.Adapter &lt;linearAdapter.linearViewHolder&gt;<span style="color: rgba(0, 0, 0, 1)">{
    @NonNull

    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Context mContext;
    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> linearAdapter(Context context){

      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.mContext =<span style="color: rgba(0, 0, 0, 1)"> context;

    }
    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> linearAdapter.linearViewHolder onCreateViewHolder(@NonNull ViewGroup parent, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> viewType) {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">这里需要一个Context所以定义一个context再在构造方法中实现</span>
      <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span> linearViewHolder(LayoutInflater.from(mContext).inflate(R.layout.layout_linear_item,parent,<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">));

    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> onBindViewHolder(@NonNull linearAdapter.linearViewHolder holder, <span style="color: rgba(0, 0, 255, 1)">final</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> position) {
      holder.textView.setText(</span>"hello world!"<span style="color: rgba(0, 0, 0, 1)">);
      holder.itemView.setOnClickListener(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> View.OnClickListener() {
            @Override
            </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onClick(View v) {
                Toast.makeText(mContext,</span>"clicked....."+<span style="color: rgba(0, 0, 0, 1)">position,Toast.LENGTH_SHORT).show();
            }
      });

    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> getItemCount() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> 30<span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">class</span> linearViewHolder <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> RecyclerView.ViewHolder{
      </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> TextView textView;

      </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> linearViewHolder(@NonNull View itemView) {
            </span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">(itemView);
            textView</span>=<span style="color: rgba(0, 0, 0, 1)">(TextView)itemView.findViewById(R.id.tv_title);
      }
    }
}</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;onCreateViewHolder()负责为Item创建视图,onBindViewHolder()负责将数据绑定到Item的视图上。</p>
<p>&nbsp;</p>
<p class="p">&nbsp;</p>
<p class="p">&nbsp;</p>
<p class="p">&nbsp;</p>
<p class="p"><span style="font-family: 宋体">用</span>web<span style="font-family: 宋体">加载</span><span style="font-family: Calibri">html</span><span style="font-family: 宋体">或者网页网址等为当前</span><span style="font-family: Calibri">activity</span></p>
<p class="p"><span style="font-family: 宋体">下面的</span>class<span style="font-family: 宋体">是自己写一个</span><span style="font-family: Calibri">web</span><span style="font-family: 宋体">客户端</span><span style="font-family: Calibri">,</span><span style="font-family: 宋体">可以不自己写</span></p>
<p class="p">调用默认的</p>
<p class="p"><img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614220218392-1581316388.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="p">页面的显示隐式跳转</p>
<p align="justify">&nbsp;</p>
<p align="justify">&nbsp;<img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614220230202-2043672057.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/2045584/202006/2045584-20200614220235293-876206153.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="p">传参<strong>2<span style="font-family: 宋体">、打开新的</span><span style="font-family: Verdana">Activity</span><span style="font-family: 宋体">并传递参数</span></strong></p>
<p class="p">MainActivity.java<span style="font-family: 宋体">传递参数</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> OpenNew(View v){
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">新建一个显式意图,第一个参数为当前Activity类对象,第二个参数为你要打开的Activity类</span>
    Intent intent =<span style="color: rgba(0, 0, 255, 1)">new</span> Intent(MainActivity.<span style="color: rgba(0, 0, 255, 1)">this</span>,MainActivity2.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
   
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">用Bundle携带数据</span>
    Bundle bundle=<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Bundle();
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">传递name参数为tinyphp</span>
    bundle.putString("name", "tinyphp"<span style="color: rgba(0, 0, 0, 1)">);
    intent.putExtras(bundle);
   
    startActivity(intent);      
    }</span></pre>
</div>
<p class="p">MainActivity2.java<span style="font-family: 宋体">接收参数</span></p>
<p class="p">&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onCreate(Bundle savedInstanceState) {
      </span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">.onCreate(savedInstanceState);
      setContentView(R.layout.newtest);   
      
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">新页面接收数据</span>
      Bundle bundle = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.getIntent().getExtras();
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">接收name值</span>
      String name = bundle.getString("name"<span style="color: rgba(0, 0, 0, 1)">);
       Log.i(</span>"获取到的name值为"<span style="color: rgba(0, 0, 0, 1)">,name);   
    }</span></pre>
</div>
<p class="p">&nbsp;</p>
<p class="p"><span style="font-family: 宋体">搞不清楚</span>Bundle<span style="font-family: 宋体">去</span><span style="text-decoration: underline">https://blog.csdn.net/randyjiawenjie/article/details/6651437</span></p>
<p class="p">&nbsp;</p>
<p class="pre"><span style="font-family: 宋体">在项目</span>camera中还有一种传参可参考。/ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在启动摄像头程序时,因为要传回拍摄的图像,所以调用了<br>// &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Activity.startActivityForResult(Intent intent, int requestCode) 方法。<br>// &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当 startActivityForResult() 方法启动的 Activity 正常结束时,<br>// &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;会自动返回发出请求的 Activity,<br>// &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;并且该方法会返回对应的 requestCode 值给<br>// &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onActivityResult(int requestcode, int resultCode,Intent data) 方法,<br>// &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;借此可以在请求 Activity 和发出请求的 Activity 之间进行数据传递。<br>// &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本实例借助于这一特点传回了 Android 系统照相机程序拍摄的照片。</p>
<p><strong><span style="font-family: 宋体">&nbsp;</span></strong></p>
<p class="p"><span style="text-decoration: underline"><span class="15">https://blog.csdn.net/MonaLisaTearr/article/details/79643048</span></span></p>
<p class="pre">Bitmap参考这里https://blog.csdn.net/MonaLisaTearr/article/details/79643048</p>
<p class="p">和这里<span style="text-decoration: underline">http://c.biancheng.net/view/3039.html</span></p><br><br>
来源:https://www.cnblogs.com/yangj-Blog/p/13124224.html
頁: [1]
查看完整版本: android开发-java