连接列表和详细信息

本文讲述了如何在Android应用中,通过WorkoutListFragment与MainActivity之间的接口交互,实现在点击训练项目列表时显示详细信息的功能,涉及接口定义、监听器注册和Activity间数据传递。
摘要由CSDN通过智能技术生成

现在单击其中一个训练项目时,什么都不会发生,还需要更新代码使得单击一个训练项目时会显示这个训练项目的详细信息。

连接列表和详细信息

要启动DetailActivity并显示所单击的训练项目的详细信息,这还有很多办法。这里将使用以下技术:
1、在WorkoutListFragment中增加代码,等待单击某个训练项目。
2、这个代码运行时,调用MainActivity.java中的代码,启动DetailActivity并传入训练项目的ID。
3、让DetailActivity将这个ID传递到WorkDetailFragment,让片段显示对应的训练项目的详细信息。

使用接口解耦合片段

修改WorkoutListFragment的代码;
1、定义接口。
我们将在WorkoutListFragment中定义监听器的接口,之所以在这里定义接口,是因为这个接口的作用就是允许WorkoutListFragment与活动通信。
2、WorkoutListFragment关联到活动时注册监听器(在这里监听器就是MainActivity)。这会为WorkoutListFragment提供MainActivity的一个引用。
3、单击某一项时告诉监听器。
然后MainActivity就能对这个单击做出响应。

创建一个监听器

1、定义监听器接口:

  interface Listener{
        void itemClicked(long id);
    }
    

如此一来,实现Listener接口的所有活动都必须包含itemClicked这个办法。我们将用这个方法让活动对片段中单击的列表项做出响应。
2、注册监听器

private Listener listener;

public void onAttach(Context context){
    super.onAttach(context);
    this.listener = (Listener) context;
}

3、响应单击

    public void onListItemClick(ListView listview, View itemView, int position, long id){
        //调用活动中的itemClicked()方法,传入用户选择的训练项目的ID
        if (listener != null)listener.itemClicked(id);
    }

4、完整的WorkoutListFragment.java代码:

package com.hfad.workout;

import android.content.Context;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class WorkoutListFragment extends ListFragment {

    static interface Listener{
        void itemClicked(long id);
    }

    private Listener listener;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        String[] names = new String[Workout.workouts.length];
        for (int i = 0; i < names.length; i++){
            //创建一个包含训练xian
            names[i] = Workout.workouts[i].getName();
        }
        //创建一个数组适配器
        ArrayAdapter<String> adapter = new ArrayAdapter<>(inflater.getContext(), android.R.layout.simple_list_item_1, names);
        //将数组适配器绑定到列表视图
        setListAdapter(adapter);
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    public void onAttach(Context context){
        super.onAttach(context);
        this.listener = (Listener) context;
    }

    public void onListItemClick(ListView listview, View itemView, int position, long id){
        //调用活动中的itemClicked()方法,传入用户选择的训练项目的ID
        if (listener != null)listener.itemClicked(id);
    }
}

MainActivity需要实现接口

package com.hfad.workout;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity implements WorkoutListFragment.Listener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void itemClicked(long id) {
        Intent intent = new Intent(this, DetailActivity.class);
        intent.putExtra(DetailActivity.EXTRA_WORKOUT_ID, (int)id);
        startActivity(intent);
    }
}

DetailActivity需要向WorkoutDetailFragment传递ID

package com.hfad.workout;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity implements WorkoutListFragment.Listener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void itemClicked(long id) {
        Intent intent = new Intent(this, DetailActivity.class);
        intent.putExtra(DetailActivity.EXTRA_WORKOUT_ID, (int)id);
        startActivity(intent);
    }
}

现在可以试试应用了,在首页单击列表会显示出更详细的信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值