Android中ListView适配器中的view重用和接口回调

来源:互联网 发布:smali语法编程 编辑:程序博客网 时间:2024/05/17 11:59

效果图:


项目结构:


MainActivity中:
说明的地方在代码中的注释里
package com.example.zhh.myapplicationinterface;import android.app.Activity;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import java.util.ArrayList;import java.util.List;public class MainActivity extends Activity {    private ListView lvText;    private TextView tvMyyyy;    Myadapter myadapter=null;    ArrayList<String>listAll=new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        lvText = (ListView)findViewById(R.id.lvText);        tvMyyyy = (TextView)findViewById(R.id.tvMyyyy);        tvMyyyy.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Toast.makeText(MainActivity.this, "按钮点击了。。。", Toast.LENGTH_SHORT).show();                myTest();            }        });    }    private void myTest(){        if(myadapter==null) {            listAll.addAll(getData());            myadapter=new Myadapter(listAll,MainActivity.this);            lvText.setAdapter(myadapter);//          回调相当于把对象new Myadapter.MyBtnClickInterFace()对象传给Myadapter中myBtnClickInterFace对象//          myBtnClickInterFace.setClick(position);调的就是myBtnClickInterFace对象调用重写后的方法            myadapter.setMyOnclick(new Myadapter.MyBtnClickInterFace() {                @Override                public void setClick(int position) {                    Toast.makeText(MainActivity.this, "position>>>"+position, Toast.LENGTH_SHORT).show();                }            });        }else{            listAll.add("zhh1");            listAll.add("zhh2");            listAll.add("zhh3");            myadapter.notifyDataSetChanged();//          如果下面不回调,一样可以出发回调的点击事件,因为上面已经给Myadapter中myBtnClickInterFace对象//          已经赋值过,并且myBtnClickInterFace.setClick(position);就是myBtnClickInterFace对象调用重写后//          的方法//          重新实例化对象(就是重新调下面的点击事件)new Myadapter.MyBtnClickInterFace()对象传给Myadapter//          中myBtnClickInterFace对象//          myBtnClickInterFace.setClick(position);调的就是myBtnClickInterFace对象调用重写后的方法//          在Myadapter中打印myBtnClickInterFace对象,发现和上面的对象不一样//            myadapter.setMyOnclick(new Myadapter.MyBtnClickInterFace() {//                @Override//                public void setClick(int position) {//                    Toast.makeText(MainActivity.this, "position>>>" + position, Toast.LENGTH_SHORT).show();//                }//            });        }    }    private ArrayList<String>  getData(){        ArrayList<String>list = new ArrayList<>();        for(int i = 0; i <50 ; i++) {            list.add("zhh点击>>>"+i);        }        return list;    }}
Myadapter中
package com.example.zhh.myapplicationinterface;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.TextView;import java.util.ArrayList;import java.util.logging.Logger;/** * Created by 16838 on 2017/4/18. */public class Myadapter extends BaseAdapter{    ArrayList<String>list;    Context context;    MyBtnClickInterFace myBtnClickInterFace;//  构造方法    public Myadapter(ArrayList<String>list,Context context){        this.list=list;        this.context=context;    }//  回调方法    public void setMyOnclick(MyBtnClickInterFace myBtnClickInterFace){        this.myBtnClickInterFace=myBtnClickInterFace;    }//  回调接口    interface MyBtnClickInterFace{        public void setClick(int position);    }    @Override    public int getCount() {        return list.size();    }    @Override    public Object getItem(int position) {        return list.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(final int position, View view, ViewGroup viewGroup) {        ViewHoder viewHoder =null;//      注意这里使用的是getView方法中的参数view,否则不可被重用        if(view==null) {            viewHoder=new ViewHoder();            view = LayoutInflater.from(context).inflate(R.layout.item_layout,null);            viewHoder.tvTest= (TextView) view.findViewById(R.id.tvTest);            view.setTag(viewHoder);        }else{            viewHoder= (ViewHoder) view.getTag();        }        viewHoder.tvTest.setText(list.get(position));//      在按钮点击事件中回调        viewHoder.tvTest.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                 Log.e("111","myBtnClickInterFace>>>"+myBtnClickInterFace);                 if(myBtnClickInterFace!=null) {//                   执行回调方法                     myBtnClickInterFace.setClick(position);                 }            }        });        return view;    }    class ViewHoder{        TextView tvTest;    }}
activity_main.xml中
<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"    tools:context=".MainActivity"    android:orientation="vertical"    >    <TextView        android:id="@+id/tvMyyyy"        android:layout_width="match_parent"        android:layout_height="50dp"        android:text="按钮点击"        android:gravity="center"        android:background="#CC99FF"        />   <ListView       android:id="@+id/lvText"       android:layout_width="match_parent"       android:layout_height="wrap_content"></ListView></LinearLayout>
item_layout.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    >    <TextView        android:id="@+id/tvTest"        android:layout_width="match_parent"        android:layout_height="30dp" /></LinearLayout>

源码下载:http://download.csdn.net/detail/zhaihaohao1/9818520



0 0
原创粉丝点击