现在单击其中一个训练项目时,什么都不会发生,还需要更新代码使得单击一个训练项目时会显示这个训练项目的详细信息。
连接列表和详细信息
要启动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);
}
}
现在可以试试应用了,在首页单击列表会显示出更详细的信息。