Android中ListView适配器中的view重用和接口回调
2017-04-19 08:54
567 查看
效果图:项目结构:
源码下载:http://download.csdn.net/detail/zhaihaohao1/9818520
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
相关文章推荐
- Android ListView适配器BaseAdapter中getItemViewType需要注意的问题
- 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件
- Android ListView适配器Adapter的使用,item的复用和ViewHolder优化
- android listview接口回调
- android listview的item view重用
- 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件
- Android性能:经典ListView适配器convertView缓存及复用机制
- Android性能优化之Listview(ViewHolder重用机制)
- Android性能优化之Listview(ViewHolder重用机制)
- Android中封装View提供接口供点击事件回调的方法及使用
- [Android实例] 推荐给你们一个好用的ListView、RecyclerView适配器
- Android性能:经典ListView适配器convertView缓存及复用机制
- 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件
- android listview 重用view导致的选择混乱问题
- Android中ListView与适配器ArrayAdapter,SimpleAdapter,定义BaseAdapter适配器,ListView添加headerView,ListView滚动到最后一项
- Android中使用回调接口实现自定义view的点击事件
- RecyclerView的基本用法 (一个控件实现ListView, GridView等效果)+接口回调点击事件
- RecyclerView(ListView)简单和接口回调
- Android 轻量级万能适配器,通吃所有的 AbsListView、RecyclerView
- Android中Recyclerview使用7----条目中按钮点击事件,在activity中调用(接口回调)