Android中ListView适配器中的view重用和接口回调(接口传参),方法传参

I.view的重用参考

https://blog.csdn.net/zhaihaohao1/article/details/41863727

II.接口回调(接口传参)

效果图:

Android中ListView适配器中的view重用和接口回调(接口传参),方法传参_第1张图片

 

项目结构:

Android中ListView适配器中的view重用和接口回调(接口传参),方法传参_第2张图片

 

 

使用场景:就是在适配器中,条目中的按钮点击之后, 把数据传到 Activity

先把列表适配器 绑定好

一、接口回调(接口传参)常用写法

1.适配器 TestAdapter 中把方法和回调接口写好

    /**
     * 方法 回调接口
     */
    IJieKou iJieKou;
    public void setMethod(IJieKou iJieKou){
        this.iJieKou = iJieKou;
    }

    public interface  IJieKou{
        public void set(String str);
    }

2.适配器 TestAdapter 中,按钮点击事件中开始传参

                if(iJieKou!=null) {
                    iJieKou.set(position+"");
                }

3.在 MainActivity 中接收数据

        // 接收到适配器中传来的数据
        testAdapter.setMethod(new TestAdapter.IJieKou() {
            @Override
            public void set(String str) {
                Toast.makeText(MainActivity.this, ""+str, Toast.LENGTH_SHORT).show();
            }
        });

OK,完了

下面贴完整代码

TestAdapter 传数据
package com.zhh.android.test1;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;


import com.zhh.android.R;
import com.zhh.android.test1.MainActivity;
import com.zhh.android.test2.TestAdapterTwo;

import java.util.List;

/**
 * 用来测试适配器
 */
public class TestAdapter extends BaseAdapter {
    private Context context;
    private List list;

    public TestAdapter(Context context, List list) {
        this.context = context;
        this.list = list;
    }

    @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 convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(
                    R.layout.item_layout, null);
            holder = new ViewHolder();
            holder.button = (Button) convertView.findViewById(R.id.button);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.button.setText("one>>>"+list.get(position));
        holder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 传数据
                if(iJieKou!=null) {
                    iJieKou.set(position+"");
                }

            }
        });

        return convertView;
    }

    /**
     * 方法 回调接口
     */
    IJieKou iJieKou;
    public void setMethod(IJieKou iJieKou){
        this.iJieKou = iJieKou;
    }

    public interface  IJieKou{
        public void set(String str);
    }


    class ViewHolder {
        Button button;
    }

}

MainActivity 中接收数据
package com.zhh.android.test1;

import android.app.Activity;
import android.os.Bundle;

import android.util.Log;
import android.widget.ListView;
import android.widget.Toast;

import com.zhh.android.R;
import com.zhh.android.test2.TestAdapterTwo;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends Activity {
    private ListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = findViewById(R.id.listView);

        // 绑定适配器
        TestAdapter testAdapter = new TestAdapter(this,getData());
        listView.setAdapter(testAdapter);

        // 接收到适配器中传来的数据
        testAdapter.setMethod(new TestAdapter.IJieKou() {
            @Override
            public void set(String str) {
                Toast.makeText(MainActivity.this, ""+str, Toast.LENGTH_SHORT).show();
            }
        });
    }
    /**
     * 造一组假数据
     */
    private List getData(){
        List list = new ArrayList<>();
        for(int i = 0; i <20 ; i++) {
            list.add("zhh"+i);
        }
        return list;
    }




}

activity_main.xml 




    

    

item_layout.xml


    

接口传参(接口回调的另一种写法)

https://blog.csdn.net/zhaihaohao1/article/details/46385587

就是把接口单独写个文件,接收消息时实现接口,调方法传入this即可,就是上面写法的变形

III 方法传参:

在 Activty 中写个方法, 接收数据

    /**
     * 接收消息
     */
    public void receiveArgs(String str){
        Toast.makeText(MainActivityThree.this, ""+str, Toast.LENGTH_SHORT).show();
    }

在 Adapter 中发消息

        holder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 传数据
                MainActivityThree mainActivityThree = (MainActivityThree) context;
                mainActivityThree.receiveArgs("数据>"+position);
            }
        });

OK,这样也能传数据

源码下载

https://download.csdn.net/download/zhaihaohao1/9818520

 

 

 

 

 

 

 

你可能感兴趣的