您的位置:首页 > 移动开发 > Android开发

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

2017-04-19 08:54 567 查看
效果图:项目结构:
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

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐