Intent를 통해 액티비티를 띄우는 방법을 알고 계시다면, 동일하게 처리하시면 됩니다.
코드를 약간 수정해서 조금 더 읽기 좋게 만들면서 필요한 코드를 집어 넣을게요.
public class search extends Fragment {
private static final String key="20220921NVF7XYD8DH0PUMNT2RWG"; //농사로 검색 키
...
private XmlPullParser xpp;
private Bitmap bitmap;
private PlantAdapter adapter;
private final List<String> data1 = new ArrayList<>();
private final Lis<String> imgdata = new ArrayList<>();
// 액티비티 안에 public static 으로 데이터를 공유하시지 마세요. 라이프 사이클에 따라서 데이터가 초기화 될 수 있습니다.
private final List<Plant> plantList = new ArrayList<Plant>();
private SendEventListener SendEventListener;
private TextView textView;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup
container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.search, container, false);
}
public void onAttach(Context context) {
...
}
@Override
public void onViewCreated (View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setupViews();
}
private void setupViews() {
View view = requireView();
search_edit = (EditText) view.findViewById(R.id.edit);
button = view.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
fetchPlantList();
}
});
listView = view.findViewById(R.id.listview);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
showPlantDetails(position);
}
});
adapter = new PlantAdapter();
listView.setAdapter(adapter);
}
private void fetchPlantList() {
}
private void showPlantDetails(int position) {
}
}
fetchPlantList에 기존에 네트워크를 통해 식물리스트를 가져오는 코드를 위치시킵니다. 그런데 대부분의 안드로이드 개발에서는 쓰레드를 직접 사용해서 REST API를 호출하지 않습니다. 쓰레드를 직접 핸들링할 수는 있지만, 처리해야 할 일들이 많기 때문에, 대부분은 라이브러리를 통해 처리합니다. Retrofit 이 제일 많이 사용되고 있고, Volley도 종종 사용됩니다. 안드로이드를 계속 하실 계획이라면, 이 라이브러리들은 별도로 공부를 하시는게 좋습니다. 여기서는 기존 코드를 사용하는 걸로 하겠습니다.
이미지를 가져오는 부분은 대부분의 개발자가 사용하는 Glide 라는 라이브러리를 사용하시기 바랍니다. (https://github.com/bumptech/glide) 이미지 네트워크를 통해 가져오는 코드는 쓰레딩, 네트워크 취소, 스케일링, 캐시 등등 고려해야할 요소가 상당히 많기 때문에, 동작원리는 이해하되 라이브러리를 사용하는게 낫습니다.
Plant 클래스를 약간 수정해서 이름과 이미지 URL경로를 필드로 설정하도록 하겠습니다.
public class Plant {
private final static String IMAGE_BASE_URL = "http://www.nongsaro.go.kr/cms_contents/301/";
private final String name;
private final String imageUrl;
public Plant(String name, String imagePath) {
this.name = name;
this.imageUrl = IMAGE_BASE_URL + imagePath;
}
public String getName() {
return name;
}
public String getImageUrl() {
return imageUrl;
}
}
이미지 데이터를 가져오는 부분은 비동기이므로 작업이 끝난 것을 알려면 콜백을 통해 처리해야 합니다. 버튼 클릭 이벤트를 처리할 때 리스너를 사용하는 것과 동일한 구조입니다. 이미지 데이터를 처리 결과를 받을 수 있도록 리스너 인터페이스를 하나 만듭니다.
interface PlantFetchListener {
void onPlantFetchSuccess(List<Plant> plantList);
void onPlantFetchFailure(Exception e);
}
fragment에 구현되지 않았던 메소들을 채워 넣겠습니다. 먼저 fragment가 PlantFetchListener를 구현하도록 변경합니다.
// PlantAdapter의 아이템 리스트를 외부에서 설정할 수 있도록 코드 추가.
public class PlantAdapter ... {
private List<Plant> items = new ArrayList<>();
public void setItems(List<Plant> items) {
this.items = items;
notifyDataSetChanged();
}
public int getItemCount() {
return items.size();
}
...
}
public class search extends Fragment implements PlantFetchListener {
@Override
public void onPlantFetchSuccess(List<Plant> plantList) {
runOnUiThread(new Runnable() {
@Override
public void run() {
search_edit.setText(null);
setUpOnClickListense();
adapter.setItems(plantList);
}
});
}
@Override
public void onPlantFetchFailure(Exception e) {
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO: 에러메세지 출력(Toast, Snackbar..)
}
});
}
}