Android 学习笔记(11)—— ListView 实现活动跳转

来源:互联网 发布:淘宝什么时候能买彩票 编辑:程序博客网 时间:2024/06/06 02:16

作者:夏至 欢迎转载,也请保留这段申明,谢谢

你是否已经很厌倦每次学习新的控件或者其他知识就重新新建工程?

我们既然已经学过了ListView和Intent
这里写图片描述

那能不能像上图那样,点击Search的时候,就跳到Search这个活动去?
答案是肯定得,今天我们就来实现这个功能。以后我们要学习新的控件,就可以不用新建工程,直接添加活动即可。

首先,我们在layout上新建一个ListView。

<?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">    <ListView     android:id="@+id/list_item"     android:layout_width="match_parent"     android:layout_height="wrap_content">    </ListView></LinearLayout>

接下来我们新建一个类,用来显示控件名字等。ListData.class

public class ListData {     public ListData(){}

想一下我们的匿名方法要传什么参数?第一个肯定是 contenx 这个不用说,第二个的话就是我们的名称了,所以应该是 String name,那第三个呢?
如第一幅图,我们在点击的时候,是不是要跳转?所以,第三个应该是intent。完整代码如下:

public class ListData {    private Context context;    private String DadaName;    private Intent intent;    public ListData(Context context,String DadaName,Intent intent){        this.context = context;        this.DadaName = DadaName;        this.intent = intent;    }    public Context getContext() {        return context;    }    public String getDadaName() {        return DadaName;    }    public Intent getIntent() {        return intent;    }    //用来显示名字,可以试着把它去掉,这样,listview就只显示类名而不是我们想要的字符串    public String toString() {        return getDadaName();    }    public void StartActity(){        getContext().startActivity(intent);    }}

接下来就是为第三个参数作服务了。还记上一节我们讲的Intent吧?这次我们用显示Intent就可以了。
首先新建一个layout,用于另外一个活动的布局test(名字可以自取)。代码如下:

<? 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 :layout_width="match_parent" android :layout_height="wrap_content" android :text="这是个测试" android :textSize="24sp"/></LinearLayout>

然后新建一个class,这里只是用来测试,就不写太复杂了

public class Test extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState) ; setContentView( R.layout.test) ; }}

别忘了,我们需要在 AndroidManifest.xml 注册我们的活动

     </intent-filter>    </activity>    <activity android :name=".Test"></activity></application>

万事俱备,只差主activity了。代码如下:

public class MainActivity  extends AppCompatActivity { ArrayAdapter <ListData> adapter;    private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState) ; setContentView( R.layout.linearlayout) ; listView = ( ListView)findViewById(R.id .list_item) ; adapter = new ArrayAdapter< ListData>(this, android.R.layout.simple_list_item_1) ; adapter.add( new ListData(this, "RatingButton" ,new Intent(this,Test .class))) ; //把我们要实现的加进去 listView.setAdapter( adapter);  }}

这样就可以啦!!!
不过这时候,有同学点的时候,发现没反应!难道是我写错了?别急,我们还没写点击事件呢。怎么可能有反应?
新建一个class。用来响应点击事件。

public class ListClickListen implements AdapterView.OnItemClickListener{ private Context context;    private ArrayAdapter <ListData> adapter; //第二个参数,把我们已经封装好的adapter传进来 public ListClickListen(Context context,ArrayAdapter <ListData> adapter){ this .context = context ;        this. adapter = adapter; } public Context getContext() { return context; } public ArrayAdapter<ListData > getAdapter() { return adapter; } //点击相应事件 public void onItemClick(AdapterView <?> parent, View view, int position, long id) { ListData listData = adapter.getItem(position) ;//获取点击的事件 listData.StartActity() ; }}

大功告成,以后我们都会基于这种模式。效果如图所示:
这里写图片描述

我觉得这种方式还是不错的,因为我们在学习控件,工程上不可能很大,如果每次都新建一个工程,很麻烦,还不如用这种方式,当然这只是个人喜好而已

0 0