zoukankan      html  css  js  c++  java
  • BaseAdapter的三种表达式分析,startActivityForResult的使用

    (一)BaseAdapter的三种表达式:

    ①逗比式

    public View getView(int position, View convertView, ViewGroup parent) {
    
            //逗比式
            View view=minflater.inflate(R.layout.item,null);
            ImageView imageView=(ImageView) view.findViewById(R.id.iv_image);
            TextView title=(TextView) view.findViewById(R.id.tv_title);
            TextView content=(TextView) view.findViewById(R.id.tv_content);
            ItemBean bean=mlist.get(position);
            imageView.setImageResource(bean.imageid);
            title.setText(bean.title);
            content.setText(bean.content);
            return view;
    }

    每进行一次getView就要利用inflater对象去创建一个新的view,并在View中找到相应的控件并给他设置相应的值,这样完全没有利用到ListView的缓存机制,因此称为“逗比式”。

    ②普通式

    既然“逗比式”没有利用到缓存机制,那么我们的普通式就要好好利用。

    如何利用?我们需要判断一下convertview是否已经缓存过,如果没有缓存过就创建一个view。如下面的代码:

    //普通式
           if(convertView==null)
            {
                convertView=minflater.inflate(R.layout.item,null);
            }
            ImageView imageView=(ImageView) convertView.findViewById(R.id.iv_image);
            TextView title=(TextView) convertView.findViewById(R.id.tv_title);
            TextView content=(TextView) convertView.findViewById(R.id.tv_content);
            ItemBean bean=mlist.get(position);
            imageView.setImageResource(bean.imageid);
            title.setText(bean.title);
            content.setText(bean.content);
            return convertView;
    }

    他虽然对缓存资源进行了合理的利用,但是还是存在一些问题,不够优化,每次都要去布局中需找部件,findviewbyid是很耗费时间的,这样在小程序中可能体现不出什么,但是总归是耗费时间的,因此我们要对其进行优化。

    ③文艺式:

    在文艺式中我们需要为findviewbyid进行优化,

     //文艺式
            /*利用ViewHolder优化BaseAdapter思路:
            1.创建Bean对象,用于封装数据
            2.在构造方法中初始化用于映射的数据List
            3.创建ViewHolder类,创建布局映射关系
            4.判断convertView,为空则创建,并设置tag;否则通过tag来取出viewholder
            5.给viewholder中的空间设置数据*/
    
            ViewHolder viewHolder;
            if(convertView==null){
                convertView=minflater.inflate(R.layout.item,null);
                viewHolder=new ViewHolder();
                viewHolder.imageView=(ImageView)convertView.findViewById(R.id.iv_image);
                viewHolder.title=(TextView)convertView.findViewById(R.id.tv_title);
                viewHolder.content=(TextView)convertView.findViewById(R.id.tv_content);
                convertView.setTag(viewHolder);
            }else{
                viewHolder=(ViewHolder) convertView.getTag();
            }
            ItemBean bean=mlist.get(position);
            viewHolder.imageView.setImageResource(bean.imageid);
            viewHolder.title.setText(bean.title);
            viewHolder.content.setText(bean.content);
            return convertView;
        }
        class ViewHolder{
            public ImageView imageView;
            public TextView title;
            public TextView content;
        }

    (二)startActivityForResult的应用

    startActivityForResult startActivityForResult(Intent intent, int requestCode)。这个方法我一般用来在ActivityA中启动另个activityB。当返回的时候需要携带来自B的数据。ActivityA更新界面。
    1.首先要在activityA中启动startActivityForResult(Intent intent, int requestCode)

    btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent=new Intent(MainActivity.this,HeadActivity.class);
                    startActivityForResult(intent,0x11);
                }
            });

    参数1.就是一个intent 你可以携带一些数据。当然也可以不携带

    参数2.requescode,你自定义的一个int类型的数值(一般>0);

    2.还有一个方法。这个方法是在ActivityB中使用的,主要一定要在finish()之前调用该方法,不然不起作用

    setResult(int resultCode, Intent data)

     gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Intent intent=getIntent();
                    Bundle bundle=new Bundle();
                    bundle.putInt("imageId",imageId[position]);
                    intent.putExtras(bundle);
                    setResult(0x11,intent);
                    finish();
                }
            });

    同样还是两个参数,

    参数1:resultcode,先说作用。这个参数有两个作用。第一个可以用来判断有没有返回成功。还有一个作用同样可以判断是从哪个activity返回来的

     为什么呢。这个参数可以自定义。如果返回成功了,当时你在activityB中定义的什么,那么 在

    onActivityResult(int requestCode, int resultCode, Intent data)这个方法中就会接收到什么。所以可以用来判断来这哪个activity。 如果失败了(比如你在ActivityB中直接按了返回键。什么都没有操作),这种情况在ActivityA中接收到的requestcode 就是0. 所以这个参数我一般用来判断是否返回成功。

    3.最后在ActivityA中onActivityResult(int requestCode, int resultCode, Intent data)中接收数据,并判断requestCode和resultCode是不是你想要的,然后进行取值。

    一个案例:进行头像的切换

     点击切换头像,到另一个页面

     选好后,就会自动回到上个页面并且头像切换成功

     activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/beijing"
        android:paddingTop="40dp"
        android:orientation="vertical" >
    
        <ImageView
            android:id="@+id/t_image"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_gravity="center_horizontal"
            android:src="@drawable/touxiang" />
    
        <Button
            android:id="@+id/btn"
            android:layout_width="wrap_content"
            android:layout_height="40dp"
            android:layout_gravity="center_horizontal"
            android:text="选择头像"
            />
    
    </LinearLayout>

    activity_head.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".HeadActivity">
        <GridView
            android:id="@+id/gridView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="10dp"
            android:horizontalSpacing="3dp"
            android:verticalSpacing="3dp"
            android:numColumns="4">
        </GridView>
    </RelativeLayout>

    MainActivity.java

    package com.example.startactivityforresult;
    
    import androidx.annotation.Nullable;
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
        ImageView imageView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button btn=(Button)findViewById(R.id.btn);
    
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent=new Intent(MainActivity.this,HeadActivity.class);
                    startActivityForResult(intent,0x11);
                }
            });
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode,  Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if(requestCode==0x11 && resultCode==0x11)
            {
                Bundle bundle=data.getExtras();
                int image=bundle.getInt("imageId");
                int k=bundle.getInt("word");
                imageView=(ImageView)findViewById(R.id.t_image);
                imageView.setImageResource(image);
            }
        }
    }

    HeadActivity.java

    package com.example.startactivityforresult;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.BaseAdapter;
    import android.widget.GridView;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    public class HeadActivity extends AppCompatActivity {
        public int[] imageId = new int[]{R.drawable.touxiang1, R.drawable.touxiang2,
                R.drawable.touxiang3, R.drawable.touxiang4, R.drawable.touxiang5
        };   // 定义并初始化保存头像id的数组
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_head);
            GridView gridView=(GridView)findViewById(R.id.gridView);
            BaseAdapter baseAdapter=new BaseAdapter() {
    
                @Override
                public int getCount() {
                    return imageId.length;
                }
    
                @Override
                public Object getItem(int position) {
                    return position;
                }
    
                @Override
                public long getItemId(int position) {
                    return position;
                }
    
                @Override
                public View getView(int position, View convertView, ViewGroup parent) {
                    ImageView imageView;
                    if(convertView==null){
                        imageView=new ImageView(HeadActivity.this);
                        imageView.setAdjustViewBounds(true);
                        imageView.setMaxHeight(158);
                        imageView.setMaxWidth(150);
                        imageView.setPadding(5, 5, 5, 5);
                    }else{
                        imageView=(ImageView)convertView;
                    }
                    imageView.setImageResource(imageId[position]);
                    return imageView;
                }
            };
            gridView.setAdapter(baseAdapter);
            gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Intent intent=getIntent();
                    Bundle bundle=new Bundle();
                    bundle.putInt("imageId",imageId[position]);
                    intent.putExtras(bundle);
                    setResult(0x11,intent);
                    finish();
                }
            });
        }
    }
  • 相关阅读:
    理解numpy.dot()
    Numpy数组操作
    numpy.rollaxis函数
    数组的分割
    数组的组合
    轴的概念
    Numpy数组解惑
    Django2.1.3 urls.py path模块配置
    ubuntu18.04创建虚拟环境时提示bash: /usr/local/bin/virtualenvwrapper.sh: 没有那个文件或目录 的解决办法
    对银行卡号进行验证(转)
  • 原文地址:https://www.cnblogs.com/xiaofengzai/p/12285448.html
Copyright © 2011-2022 走看看