Android ListView 中的按键点击事件的设置

来源:互联网 发布:我的世界工业js包 编辑:程序博客网 时间:2024/05/16 08:01

                                     本Demo采用的方法是使用接口回调的方式来实现的。

布局文件如下:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout 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"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.list_button.MainActivity">   <ListView       android:layout_width="match_parent"       android:layout_height="match_parent"       android:id="@+id/listview" /></RelativeLayout>
选项布局如下:
<?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"    android:descendantFocusability="blocksDescendants"    >  <TextView      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:id="@+id/text"/>    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:id="@+id/button"        android:text="@string/button_name"        android:focusable="false"/></LinearLayout>
在选项布局中,有两个需要注意的地方:
1.
android:descendantFocusability="blocksDescendants"
这里简单解析一下  
android:descendantFocusability  这个属性 在Android的api中的解析:为定义了ViewGroup及其后代之间的关系时,寻找一个视图获取焦点。
这个属性有三种值,分别为:

beforeDescendants:viewgroup会优先其子类控件而获取到焦点

        afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点

        blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点

在这里,选择blocksDescendants,这样Item就不会因为item中的子控件(Button)获得焦点,而使得点击 Item时没有响应了。
2.
 Button中的属性  focusable  设置为false
 android:focusable="false"
使得Button失去焦点,原因参考第一点。
自定义的适配器代码如下:


package com.example.list_button;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 java.util.List;import java.util.zip.Inflater;/** * Created by Adminzz on 2016/5/27. */public class MyBaseAdapter extends BaseAdapter implements View.OnClickListener {    private List<String> listtext;    private LayoutInflater inflater;    private Mycallfunction mycallfunction;//自定义接口 此接口的实现在activity中
    public interface Mycallfunction    {        public void click(View v); //此函数会被按键的点击事件调用。    }    public MyBaseAdapter(Context context,List<String> listtext,Mycallfunction mycallfunction)    {        this.inflater= LayoutInflater.from(context);/*使用LayoutInflater 获取 Item布局文件  */        this.listtext=listtext;//设置TextView的text参数        this.mycallfunction=mycallfunction;    }    @Override    public int getCount() {        return listtext.size();    }    @Override    public Object getItem(int i) {        return listtext.get(i);    }    @Override    public long getItemId(int i) {        return i;    }    @Override    public View getView(int i, View view, ViewGroup viewGroup) {        if(view==null)        {            view=inflater.inflate(R.layout.item,null);            TextView text= (TextView) view.findViewById(R.id.text);            Button button=(Button)view.findViewById(R.id.button);            text.setText(listtext.get(i));            button.setOnClickListener(this);            button.setTag(i);//  setTag  作用为:为View 添加信息,需要的时候可以调用对应的getTag来获取。        }        return view;    }    @Override    public void onClick(View view) {        mycallfunction.click(view);//调用本接口函数    }}
Activity 的代码如下:


package com.example.list_button;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.widget.Toast;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity implements MyBaseAdapter.Mycallfunction {    private ListView listView;    private List<String> listtext;    private String []data=new String[]{"澳门风云3","美人鱼","断头谷","师父","唐人街探索","我的特工爷爷"};    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        listView=(ListView)findViewById(R.id.listview);        this.listtext=new ArrayList<>();        for(int i=0;i<data.length;i++)        {            this.listtext.add(data[i]);        }        MyBaseAdapter adapter=new MyBaseAdapter(this,listtext,this);        listView.setAdapter(adapter);        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {                Toast.makeText(MainActivity.this,"第"+i+"被点击了",Toast.LENGTH_SHORT).show();            }        });    }    @Override    public void click(View v) {           Toast.makeText(this,listtext.get((Integer)v.getTag())+"正在下载中",Toast.LENGTH_SHORT).show();    }}







0 0
原创粉丝点击