zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

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

Android笔记学习 实现 11 跳转 活动 listview
2023-09-27 14:28:04 时间

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

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

我们既然已经学过了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() ;
 }
}

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

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