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

ListAdapter에서 다른 클래스로 hashmap 키값 가져오는 방법이 있나요?

0 추천

Food1_ListAdapter에서 hashamp에 따로 저장시켜놓고, Food1에서 값을 가져오고 싶은데 혹시 방법이있나요...?

Food1_ListAdapter에서는 hashmap에 정상적으로 값이 들어가는데 Food1에서 키 값을 가져오니 계속.... 널이 떨어지네요,..    혹시 가져 오는 방법이 있다면 좀 가르쳐 주시면 감사하겠습니다.....

Food1으로 키값들을 들고와서 arrList에 담아서 Pay로 보내야하는데 

지금 이 문제때문에 몇일동안 내내 수정해보고있는데 진짜로 안되네요......ㅠㅠㅠ 도와주십시요.....

미니님 가르쳐주신대로 해보는데 잘 안되네요..... ㅠ 계속 food1리스트어댑터에 저장시켜놓은 hashmap을 가져올려는데 Food1에서는 널이 뜨니.. ㅠ 

public class Food1_ListAdapter extends BaseAdapter {

	Activity context;
	ArrayList<JOrder> arrList;
	HashMap<String,String> map = new HashMap<String, String>();
	JOrder jOrder;
	int layout;

	public Food1_ListAdapter(Activity context, ArrayList<JOrder> arrList,
			int layout) {
		this.context = context;
		this.arrList = arrList;
		this.layout = layout;
	}

	public int getCount() {
		// TODO Auto-generated method stub
		return arrList.size();
	}

	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return arrList.get(position);
	}

	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	public View getView(final int position, View convertView, ViewGroup parent) {
		View v = null;
		if (convertView == null) {
			v = context.getLayoutInflater().inflate(layout, null);
		} else {
			v = convertView;
		}

		TextView food1_list_menu = (TextView) v
				.findViewById(R.id.food1_list_menu);
		final EditText food1_list_amount = (EditText) v
				.findViewById(R.id.food1_list_amount);
		TextView food1_list_price = (TextView) v
				.findViewById(R.id.food1_list_price);
		final CheckBox food1_list_choice = (CheckBox) v
				.findViewById(R.id.food1_list_choice);

		jOrder = arrList.get(position);
		
		food1_list_choice
				.setOnCheckedChangeListener(new OnCheckedChangeListener() {

					public void onCheckedChanged(CompoundButton buttonView,
							boolean isChecked) {
						
						if (food1_list_choice.isChecked()) {

							map.put(jOrder.getMenu(),"2000");
							
							Log.i("test","check:" + map.get(jOrder.getMenu()));
							
							Toast.makeText(context, "체크되었습니다",
									Toast.LENGTH_SHORT).show();
						} else {					
//							jOrder.setChoice(false);
							
							map.remove(jOrder.getMenu());
							
							Log.i("test","check.remove:" + map.get(jOrder.getMenu()));
							
							Toast.makeText(context, "체크가 해제되었습니다.",
									Toast.LENGTH_SHORT).show();
						}

					}
				});
		
		food1_list_amount.addTextChangedListener(new TextWatcher() {
			
			public void onTextChanged(CharSequence s, int start, int before, int count) {
				if(food1_list_choice.isChecked()){
					
					map.put(jOrder.getMenu(),"3000"); 
					
					Log.i("test","editText.put:" + map.get(jOrder.getMenu()));
					
				}
				else if(Integer.parseInt(food1_list_amount.getText().toString()) == 0 || food1_list_amount.getText().toString() == null || food1_list_choice.isChecked() == false){
					map.remove(jOrder.getMenu());
					
					Log.i("test","editText.remove:" + map.get(jOrder.getMenu()));
					
				}
				
			}
			
			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
				
				
			}
			
			public void afterTextChanged(Editable s) {
				 
								
			}
		});
		
		jOrder = arrList.get(position);

		food1_list_menu.setText(jOrder.getMenu());
//		food1_list_amount.setText("");
		food1_list_price.setText("" + jOrder.getPrice());

		return v;
	}

}

public class Food1 extends Activity implements OnClickListener {

	Button order_btn;
	ArrayList<JOrder> jOrder_lit;
	HashMap<String, String> map;
	ListView food1_list;
	

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

		food1_list = (ListView) findViewById(R.id.food1_list);

		onFood1List();

		order_btn = (Button) findViewById(R.id.order_food1_btn);

		order_btn.setOnClickListener(this);

	}

	public void onClick(View v) {

		if (v.getId() == R.id.order_food1_btn) {
			
			Food1_ListAdapter food1 = new Food1_ListAdapter(getParent(),
					jOrder_lit, R.id.food1_list);
			
			ArrayList<HashMap<String, String>> jOrder_lit2;
			HashMap<String, String> map = new HashMap<String, String>();
			JOrder jOrder;
			Log.i("test","map.keyset1()" + food1.map.get(jOrder.getMenu())); 
			
			Object jorder = food1.map.keySet().toArray();
			
			for (int cnt = 0; cnt < food1.map.keySet().size(); cnt++) { 
				
				jorder = food1.map.get(cnt);
				jOrder_lit2.add(jorder);
				
				Log.i("test","map.keyset()2" + map.get(jorder));

			}

				Intent order_intent = new Intent(this, Pay.class);
				order_intent.putExtra("order_list", jOrder_lit2);
				startActivity(order_intent);
			}
		}

	private void onFood1List() {
		ServerRequest request = new ServerRequest();

		Map<String, String> map = new HashMap<String, String>();
		request.Order_List(map, handler, 100);
	}

	Handler handler = new Handler() {

		public void handleMessage(Message msg) {
			super.handleMessage(msg);

			if (msg.what == 100) {
				jOrder_lit = (ArrayList<JOrder>) msg.obj;

				food1_list.setAdapter(new Food1_ListAdapter(Food1.this,
						jOrder_lit, R.layout.food1_layout));

				food1_list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

			} else {
				Toast.makeText(getApplicationContext(), "fail",
						Toast.LENGTH_SHORT).show();
			}
		}
	};

}

public class JOrder implements Serializable{

	String menu;
	int amount;
	int price;
	
	boolean choice = false;
	
	public String getMenu() {
		return menu; 
	}
	public void setMenu(String menu) {
		this.menu = menu;
	}
	
	public int getAmount() {
		return amount;
	}
	public void setAmount(int amount) {
		this.amount = amount;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	
	public boolean isChoice() {
		return choice;
	}
	public void setChoice(boolean choice) {
		this.choice = choice;
	}

}

public class Pay extends Activity implements OnClickListener{
	Button pay_btn; 
	ListView pay_list;
	ArrayList<JOrder> jOrder_List;
	String tag;

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

        pay_list = (ListView) findViewById(R.id.pay_list);
        
        onPayList();
        
        pay_btn = (Button)findViewById(R.id.pay_btn_go); 
        
        pay_btn.setOnClickListener(this);
    }
    
	private void onPayList() {
		Intent intent = getIntent();
		jOrder_List =(ArrayList<JOrder>) intent.getSerializableExtra("order_list");
		
		pay_list.setAdapter(new Pay_ListAdapter(Pay.this, 
				jOrder_List, R.layout.pay_layout)); 
	}

	public void onClick(View v) {  
		Intent pay_intent = new Intent(this, Pay_result.class);
					startActivity(pay_intent);  
			}
		}
    


 

곰돌이12 (370 포인트) 님이 2015년 12월 1일 질문
곰돌이12님이 2015년 12월 1일 수정

2개의 답변

+1 추천
 
채택된 답변
음..코드가 좀 이상한거 같아요. 일단 Food1 의 onclick 에서 어댑터를 새로 생성하는데 저러면 안되구...

아래와 같이 수정해보세요.

1. 일단  Food1_ListAdapter 클래스에 아래 함수 추가하세요.

public HashMap<String,String> getData() {

    return map;

}

2. Food1 클래스 onclick 에서 new 로 어댑터 생성하지 마시구 어댑터는 food1_list.getAdapter() 이런식으로 현재 가져온 어댑터를 가져오시구요. food1_list.getAdapter().getData(); 로 해쉬맵을 가져오시면 될것 같네요.

코드가 많아서 대충 이론적으로만 설명드렸더니 코드상의 오류가 있군요.
라쎄린드 (25,460 포인트) 님이 2015년 12월 2일 답변
곰돌이12님이 2015년 12월 5일 채택됨
말씀주신대로 food1_ListAdapter 부분에 함수 추가하였구, Food1에서 불러오기 위해 food1_list.getAdapter().getData()로 불러올려고하는데 getData함수가 올라오질 않네요..혹시 다른부분 더 추가해주어야 해나요?
Food1_ListAdapter food1 = new Food1_ListAdapter(getParent(),
                    jOrder_lit, R.id.food1_list);
대신에  Food1_ListAdapter food1 = food1_list.getAdapter() 하셔야하는데
그뒤에 food1.getData() 겠죠? 작성하신 onclick 코드 다 지우고 새로 해보세요
public void onClick(View v) {
                                               
        if (v.getId() == R.id.order_food1_btn) {
            JOrder jorder;
            Food1_ListAdapter food1 = (Food1_ListAdapter) food1_list.getAdapter();
           
            Object keys = food1.getData().keySet().toArray();
           
            for(int cnt=0; cnt < food1.getData().keySet().size(); cnt++){
               
                jorder = food1.getData().get(cnt);
                 
                jOrder_lit2.add(jorder);
                               
            }           
            }

                Intent order_intent = new Intent(this, Pay.class);
                order_intent.putExtra("order_list", jOrder_lit2);
                startActivity(order_intent);
            }

아 이런식으로 하니까 불러와지네요 ㅎ
근데 onclick소스 새로짜봣는데 이런식으로 마지막에 arraylist에 담아서 보내고싶은데 이렇게 쓰는게 맞나요?
넵 ㅋ 드디어 한고비 끝났군욤 그런데 intent로
넘길때
Bundle bundle = new Bundle();
bundle.putSerializable("value", all_thumbs);
intent.putExtras(bundle);

받을때
Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();

List<Thumbnail> thumbs=           (List<Thumbnail>)bundle.getSerializable("value");

위와 같은 형식으로 넘기고 받아야 할껍니다. 고지가 눈앞이네요 수고하세요~
하나 해결하니 하나가 문제고...ㅠㅠ 잘 진행이안되네요
문제점을 하나 발견했는데 food1_listAdapter에서 체크할때 로그를 찍을때 한개만 테스트해봤는데 여러개 체크 하면서 로그를 확인해보았는데 메뉴가 하나만 찍히네요 이건 머가 문제일까요...
...다시 문제가 원점으로..입력단 처음 부터 로그를 하나하나 찍어보세요. 로그 찍는게 여기 물어보는것보다 훨씬 문제찾기가 빠릅니다.
로그를 일단찍어보고 들어갈때 잘못됐는지 나갈때 잘못된건지 정확히 찾으세요.
그리고 나서 원인이 파악이안되면 그 부분을 질문하셔야지 소스 왕창올려서 뭐가 안된다 이러는건 본인에게도 도움이 안됩니다.
아 죄송합니다 ㅠㅠ 로그찍어가면서 하고있는데 하도 안풀리니.. 저도모르게 그만.. 다시 정신 차려서 시도 해보겠습니다. 미니님 말씀을 토대로 해볼게요
0 추천

Adapter에 interface를 구현해서 Food 에서는 Adapter에서 생성한 리스너를 받아서 사용하는 방식으로 한번해보세요.

public interface SendListener {

          public void onSendData(보낼데이터 파라미터);

     }

     private SendListener mSendListener; 

뭐 이런식으로 인터페이스 선언하고 생성자에서 객체 생성할때 food에서 SendListener를 생성해서 넘기고 mSendListener에 넣어서 콜백을 받는 형식으로..

public void Food1_ListAdapter(SendListener sendListener) {

          this.mSendListener = sendListener;

     } 

 

그리고나서 클릭이벤트가 발생하는 곳에

mSendListener.onSendData(보낼데이터 파라미터);

를 호출하면 Food로 신호를 줄것이고 그부분에서 전달받은 데이터를 처리하시면 될것 같습니다.

 

제가 질문을 이해를 잘했는지 모르겠네요..

도움이 되셨으면 좋겠습니다.

캬옹이 (37,920 포인트) 님이 2015년 12월 2일 답변
Public Food1_ListAdapter(Activity context, ArrayList<JOrder> arrList,
            int layout, SendListener sendListener) {
                    this.context = context;
                    this.arrList = arrList;             
                    this.layout = layout;
                    this.mSendListener = sendListener;
}

생성자 부분을 이런식으로 써주는게 맞나요?
...