마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

버튼을 이용해 리사이클러뷰 아이템 리스트 다른 액티비티로 전달

0 추천

mainactivity에서 switch 문을 이용해 해당 버튼을 누르면 이 mainactivity 안에 있는 리사이클러뷰에 해당버튼을 눌러 아이템을 추가하게 했습니다. 그런데 또 다른 화면에서도 또 다른 리사이클뷰 아이템 리스트를 생성해야하는데 item.add(parameter)를해서 아이템을 추가하면 반응이 없습니다. 어떻게 해야하나요?

참고로 제가 하고있는건 상품 이미지 버튼을 누르면 items.add(parameter)가 실행되어 그 밑에 그 상품에 대한 리사이클러뷰 아이템리스트가 뜨고 이거까지는 성공했어요. 상품이미지 버튼을 눌러서 기존 아이템생성 함수가 실행되고 동시에 또 다른 foods.add(parameter)가 실행되는데 이건 다른 액티비티에서 이 값이 넘어오게 하고싶습니다. mainactivity에 있는 리사이클러뷰용 클래스와 어댑터를 만들었고 다른 액티비티에 쓸 클래스와 어댑터도 따로 만들었습니다.

 

다른 액티비티용 어댑터설정을 메인액티비티 안에 넣으면 튕깁니다.

 

작은문제가 하나 더 있긴한데 같은이미지 버튼을 여러개 누르면 아이템리스트가 계속 뜨는데 해당아이템리스트는 한번만 뜨게하는법도 알려주시면감사하겠습니다.캡처1213.PNG

페피 (220 포인트) 님이 2022년 11월 22일 질문

1개의 답변

0 추천

리사이클러뷰 어댑터는 어댑터를 가지고 데이터를 처리하시마시고, 외부에서 데이터를 처리한 다음 어댑터에 전달하는 방식으로 하시는게 더 유연한 방법입니다. 그래야 데이터를 컨트롤하기도 좋고 코드를 재사용하기도 좋습니다.

어댑터에 제공하는 리스트를 처리하는 메소드 또는 클래스를 만드세요. 데이터 조회, 추가, 수정, 삭제를 여기에서 처리하시면 되구요, 이 결과를 어댑터에 전달한 후 어댑터를 갱신하면 됩니다. 이렇게 하면 다른 화면에서도 코드를 공유하기가 편합니다.

간단하게 예제 코드를 보여드리면,

public class ProductRepository {
    
    private List<Product> items = new ArrayList<>();

     public List<Product> getProductList() {
       return items;
    }

    public void addProduct(Product product) {
          items.add(product);
    }

   public void updateProduct(Product product) {
          int index = items.indexOf(product);
          if (index < 0) {
             throw new RuntimeException("아이템을 찾을 수 없습니다.");
          }
         
          items[index] = product;
   }

   public void removeProduct(Product product) {
          items.remove(product);
   }

   public void clear() {
         items.clear();
   }
}


// Activity1
public class Activity1.... {

      private ProductAdapter produtAdapter;
      private ProdcuctRepository productRepository;

      @Override
      public void onCreate(...) {
           super.onCreate(...);
           setContentView(...);

           Button addBtn = ...
           addBtn.setOnClickListener(v -> addProduct());

           productRepository = new ProductRepository();
           produtAdapter = new ProductAdapter();
           fetchProductList();
      }
       
       private void fetchProductList() {
            List<Product> productList = productRepository.getProductList() 
            produtAdapter.setItems(productList);
       }

       private void addProduct() {
           Product product = ...
           productRepository.addProduct());
           fetchProductList();
      }
}


// Activity2
public class Activity2 .... {
      
      // Same code goes here

}

 

아이템 중복 문제는 아이템을 추가할 때 중복체크를 먼저 하시면 됩니다.

public class ProductRepository {
    
    ...

    public void addProduct(Product product) {
          // 본인의 요구사항에 맞게 중복검사하는 코드 추가
          if (items.contains(product)) {
              // 중복처리(true/false 를 리턴하는 등의 적절한 처리)
              return;
          }

          items.add(product);
    }
  ...

}

 

spark (227,530 포인트) 님이 2022년 11월 22일 답변
...