Android ListView(三) 点击事件

这篇博客详细介绍了Android中ListView的三种点击事件处理:1. 在ListView中设置点击事件;2. 在Adapter中处理点击事件;3. 在Item控件级别响应点击。通过实例展示了如何实现这些点击事件,并给出了相关代码示例。

在本篇博客之前,我简单介绍过ListView的基本使用   ListView(一)     ListView(二)常见属性设置,此篇主要总结一下常用的ListView的点击事件。

首先,先创建一个名为ListViewClick的项目,

在第一页使用listview展示点击事件的种类:

(1)写在ListView的点击事件

        在控制器中实现:方法OnItemClickListener,

(2)写在Adapter的点击事件

         在Adapter中实现方法OnItemClickListener

(3)写在item控件的点击事件

         使用接口方式,重写点击

完成点击事件:(该页面可以布局三个按钮,来完成,不做文档说明,我的Demo中使用的是ListView,接下来会讲到这部分的使用)

当点击“写在ListView的点击事件”时,

跳转到新的界面,为listView。

创建一个名为ListvewclickActivity的Activity,创建Adapter名为ListvewclickAdapter,和数据模型ListvewclickBean,代码如下

ListvewclickBean:

public class ListviewclickBean {
    private String title ;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}


ListvewclickAdapter:

public class ListviewclickAdapter extends BaseAdapter {
    private Context context;
    private List<ListviewclickBean> list;
    private ListviewclickView listviewclickView;

    public ListviewclickAdapter(Context context, List<ListviewclickBean> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public int getCount() {
        return list == null ? 0 : list.size();
    }

    @Override
    public Object getItem(int position) {
        return list == null ? 0 : position;
    }

    @Override
    public long getItemId(int position) {
        return list == null ? 0 : position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        listviewclickView = null;
        ListviewclickBean bean = list.get(position);
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.adapter_listviewclick,parent,false);
            listviewclickView = new ListviewclickView();
            listviewclickView.titleView = (TextView) convertView.findViewById(R.id.title_textview);
            convertView.setTag(listviewclickView);
        }else {
            listviewclickView = (ListviewclickView) convertView.getTag();
        }
        listviewclickView.titleView.setText(bean.getTitle());
        return convertView;
    }
    static class ListviewclickView {
        private TextView titleView ;
    }
}

adapter_istvewclick.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/title_textview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="30dp"
        />
</LinearLayout>

activity_listvewclick.xml:

   <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
        
    </ListView>

ListvewclickActivity:

public class ListvewclickActivity extends AppCompatActivity implements AdapterView.OnItemClickListener{

    private List<ListviewclickBean> listviewclickBeens;
    private ListviewclickAdapter listviewclickAdapter;
    private ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_listvewclick);
        listView = (ListView) findViewById(R.id.listview);
        listviewclickBeens = new ArrayList<>();
        for (int i = 0 ; i < 10 ; i++ ){
            ListviewclickBean bean = new ListviewclickBean();
            bean.setTitle("第"+ i+ "个");
            listviewclickBeens.add(bean);
        }
        listviewclickAdapter = new ListviewclickAdapter(this , listviewclickBeens);

        listView.setAdapter(listviewclickAdapter);

        listView.setOnItemClickListener(this);
//注释部分可以替代 listView.setOnItemClickListener(this);和 @Override    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
//            @Override
//            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//                ListviewclickBean bean = listviewclickBeens.get(position);
//                Log.e("flytosky","信息展示:我点击的是—— " + bean.getTitle());
//            }
//        });
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        ListviewclickBean bean = listviewclickBeens.get(position);
        Log.e("flytosky","信息展示:我点击的是—— " + bean.getTitle());
    }
}

log日志:



当点击“写在Adapter的点击事件”时,

代码同上类似,命名分别为MyAdapterclickActivity的Activity,创建Adapter名为MyClickAdapter,和数据模型AdapterclickBean,不同代码代码如下

AdapterclickBean代码:

public class AdapterclickBean {
    private String title ;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}
MyClickAdapter代码:

public class MyClickAdapter extends BaseAdapter implements AdapterView.OnItemClickListener{
    private List<AdapterclickBean> list ;
    private Context context;
//    private

    public MyClickAdapter(Context context, List<AdapterclickBean> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public int getCount() {
        return list == null ? 0 : list.size();
    }

    @Override
    public Object getItem(int position) {
        return list == null ? 0 : position;
    }

    @Override
    public long getItemId(int position) {
        return list == null ? 0 : position;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        MyClickView myClickView = null;
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.adapter_myclickadapter,parent,false);
            myClickView = new MyClickView();
            myClickView.textView = (TextView) convertView.findViewById(R.id.title);
            convertView.setTag(myClickView);
        }else {
            myClickView = (MyClickView) convertView.getTag();
        }
        AdapterclickBean bean = list.get(position);
        myClickView.textView.setText(bean.getTitle());
        ((ListView)parent).setOnItemClickListener(this);//设置点击事件

        return convertView;
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        AdapterclickBean bean = list.get(position);

        Log.e("flytosky","信息展示 点击 :" + bean.getTitle());
    }

    static class MyClickView {
        private TextView textView;
    }
}

MyAdapterclickActivity代码:

public class MyAdapterclickActivity extends AppCompatActivity {

    private List<AdapterclickBean> list;
    private MyClickAdapter adapter;
    private ListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_adapterclick);

        list = new ArrayList<>();
        for (int i = 0 ; i < 18 ; i++) {
            AdapterclickBean bean = new AdapterclickBean();
            bean.setTitle("我是第 "+i + " 个 item。请点击我");
            list.add(bean);
        }
        adapter = new MyClickAdapter(this,list);
        listView = (ListView) findViewById(R.id.listview);

        listView.setAdapter(adapter);
    }
}
点击打印日志:


当点击“写在Item控件的点击事件”时(控件widget)

列表界面代码同上,需要添加接口,代码:

   public interface WidgetClickAdapterI {
        public void buttonclick (int position);//传入点击item的索引位置
        public void textviewclick (String text);//传入文字
    }

数据模型WidgetBean代码:

public class WidgetBean {
    private String text ;
    private String buttontitle ;

    public String getButtontitle() {
        return buttontitle;
    }

    public void setButtontitle(String buttontitle) {
        this.buttontitle = buttontitle;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

继承BaseAdapter的WidgetClickAdapter代码:

public class WidgetClickAdapter extends BaseAdapter {
    private List<WidgetBean> list ;
    private Context context;
    private WidgetClickAdapterI widgetClickAdapterI;

    public void setWidgetClickAdapterI(WidgetClickAdapterI widgetClickAdapterI) {
        this.widgetClickAdapterI = widgetClickAdapterI;
    }

public WidgetClickAdapter(Context context, List<WidgetBean> list) { this.context = context; this.list = list; } @Override public int getCount() { return list == null ? 0 : list.size(); } @Override public Object getItem(int position) { return list == null ? 0 : position; } @Override public long getItemId(int position) { return list == null ? 0 : position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { WidgetView widgetView = null; if (convertView == null){ convertView = LayoutInflater.from(context).inflate(R.layout.adapter_widgetclick,parent,false); widgetView = new WidgetView(); widgetView.textView = (TextView) convertView.findViewById(R.id.textview); widgetView.button = (Button) convertView.findViewById(R.id.button); }else { widgetView = (WidgetView) convertView.getTag(); } WidgetBean bean = list.get(position); widgetView.textView.setText(bean.getText()); widgetView.button.setText(bean.getButtontitle()); widgetView.textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (widgetClickAdapterI == null){//判断是否实现WidgetClickAdapterI的接口,如果没有实现,则退出点击的调用 return; } widgetClickAdapterI.textviewclick(((TextView) v).getText().toString());//将类型为View的v转为TextView,获取它的文字 } }); widgetView.button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (widgetClickAdapterI == null){//判断是否实现WidgetClickAdapterI的接口,如果没有实现,则退出点击的调用 return; } widgetClickAdapterI.buttonclick(position); } }); return convertView; } static class WidgetView { private Button button; private TextView textView ; } }


控制器WidgetClickActivity代码:

public class WidgetClickActivity extends AppCompatActivity implements WidgetClickAdapter.WidgetClickAdapterI{

    private List<WidgetBean> list;
    private WidgetClickAdapter adapter;
    private ListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_widget_click);

        list = new ArrayList<>();
        for (int i = 0 ; i< 18 ; i++) {
            WidgetBean bean = new WidgetBean();
            bean.setButtontitle("第 " + i + "按钮");
            bean.setText("第 " + i + "文本");
            list.add(bean);
        }
        adapter = new WidgetClickAdapter(this,list);
        adapter.setWidgetClickAdapterI(this);


 listView = (ListView) findViewById(R.id.listview); listView.setAdapter(adapter); } @Override public void buttonclick(int position) { WidgetBean bean = list.get(position); Log.e("flytosky","信息展示:我点击按钮—— " + bean.getButtontitle()); } @Override public void textviewclick( String text) { Log.e("flytosky","信息展示:我点击文本—— " + text); }}



打印日志:


源码地址:https://github.com/feifeiios/listviewclick

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值