형아들 나좀 도와줘ㅠㅠ
어플이 실행은 되는데 특정 코드에 접근하면 에러가 뜨면서 어플이 종료돼요;;
어플 구조가 어떻게 되잇냐하면..MainActivity.java, CustomAdapter.java, CustomDialog.java, Builder.java(커스텀대화상자 생성시 필요한거야)
CustomAdapter는 MainActivity에 커스텀리스트뷰가 있어서 만들어놓은거야...
커스텀리스트뷰의 리스트아이템에 텍스트뷰 여러개랑 체크박스 같은걸 여러개 넣어놧거든..대충 구조는 이래..
내가 원하는 어플실행모습은..커스텀리스트뷰에서 리스트아이템을 클릭하면 그 리스트아이템에 대한 커스텀대화상자를 띄우고
대화상자에 라디오 버튼 여러개가 잇는데 설정한 후에 확인버튼 누르면 설정된 값을 다른 리스트뷰에 받아와서 리스트아이템으로 추가 시키고 싶거든..
그런데..내가 리스트뷰의 리스트아이템 클릭 이벤트를 MainActivity.java가 아닌 CustomAdapter.java 에 만들어놧어..
그래서 CustomAdapter.java의 함수안에다 MainActivity의 객체 ma를 하나 만들고 ma로 여러방법을 시도해봣는데...
ma.showDialog(ma.CUSTOM_DIALOG); // ma.getParent().showDialog(CUSTOM_DIALOG); 요런거
그런데 안되서 이번엔 MainActivity.java 안에 public void openDialog(){MainActivity.this.showDialog(CUSTOM_DIALOG); }; 이거 만들고
CustomAdapter.java의 함수안에서 ma.openDialog(); 를 넣어봣는데..이것두 어플 실행은 되는데 리스트 클릭하면 에러뜨면서 종료ㅠㅠ;
내 짧은 지식으론 문제가 먼지 도저히 모르겟어ㅠㅠ
도와줘 형아들..
CustomAdapter.java 파일안의 함수 안에서 대화상자띄우는 코드를 어떻게 해야되?
코드 간단히 올릴게...MainActivity.java
import 문 여러개....
public class MainActivity extends Activity {
public static final int CUSTOM_DIALOG = 1;
private ListView mLvProduct;
private ArrayList<ListInfo> mProductList;
private CustomAdapter mAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
mProductList = new ArrayList<ListInfo>();
mAdapter = new CustomAdapter(this, R.layout.list_row_coffee, mProductList);
mLvProduct.setAdapter(mAdapter);
setListView();
}
@SuppressWarnings("deprecation")
public void openDialog(){
MainActivity.this.showDialog(CUSTOM_DIALOG); // 이코드가 이 파일안의 버튼 클릭이벤트의 함수 안에 넣으면잘돼
};
private void setListView()
{
//리스트 뷰 셋팅 코드
}
//커스텀다이얼로그 생성 코드
public Dialog onCreateDialog(int dialogId) {
Dialog dialog = null;
switch (dialogId) {
case CUSTOM_DIALOG :
CustomDialog.Builder customBuilder = new
CustomDialog.Builder(MainActivity.this);
customBuilder.setTitle("Custom Dialog")
.setMessage("짜잉나")
.setNegativeButton("Cancel", new DialogInterface.Listener() {
public void (DialogInterface dialog, int which) {
MainActivity.this
.dismissDialog(CUSTOM_DIALOG);
}
})
.setPositiveButton("Confirm", new DialogInterface.Listener() {
public void (DialogInterface dialog, int which) {
dialog.dismiss();
}
});
dialog = customBuilder.create();
break;
}
return dialog;
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
CustomAdapter.java
패키지
임포트문
public class CustomAdapter extends ArrayAdapter<ListInfo> implements Listener
{
private Context mContext;
private int mResource;
private ArrayList<ListInfo> mList;
private LayoutInflater mInflater;
public CustomAdapter(Context context, int layoutResource, ArrayList<ListInfo> objects)
{
super(context, layoutResource, objects);
this.mContext = context;
this.mResource = layoutResource;
this.mList = objects;
this.mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount(){
return mList.size();
}
@Override
public ListInfo getItem(int position){
return mList.get(position);
}
@Override
public int getPosition(ListInfo item){
return mList.indexOf(item);
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ListInfo list = mList.get(position);
if(convertView == null)
{
convertView = mInflater.inflate(mResource, null);
}
if(list != null)
{
TextView tvProductName = (TextView) convertView.findViewById(R.id.list_view_row_coffee_name);
tvProductName.setText(list.get_product_name());
}
// position을 tag로 저장한다.
convertView.setTag(position);
// 만들어진 뷰(row)에 클릭이벤트를 등록한다. 이벤트의 처리는 ()에서 한다.
convertView.setListener(this);
return convertView;
}
public void (View v)
{
//위에서 저장한 tag(position)을 꺼내온다.
int position = (Integer) v.getTag();.
CheckBox chk = (CheckBox) v.findViewById(R.id.list_row_check);
chk.setChecked(true);
Toast.makeText(this.getContext(),"주문버튼클릭",Toast.LENGTH_SHORT).show();
MainActivity ma = new MainActivity();
//this.getContext();
//ma.showDialog(ma.CUSTOM_DIALOG);
ma.openDialog();
//ma.getParent().showDialog(CUSTOM_DIALOG);
}
}
안 읽었지만... showDialog가 제대로 실행이 안된다는거지?
되는 액티비티도 있지만 아닌 액티비티도 있다는ㄱ ㅓ 맞음?
나같은 경우에는 Activity class 상속받은 클래스 하나 만들어서 사용했었음...상속받은 클래스에 다이얼로그 메소드로 구현해놓고..
맞아요...showDialog가 MainActivity.java 파일안에서는 잘 되는데..CustomAdapter.java에서 MainActivity 객체 통해서 실행하려면 이상하게 실행이 안되요..;;
길가던놈님아..죄송한데 제가 코딩수준이 생각하시는것보다 낮아서요...
좀더 구체적으로 답변해주세요 ㅠㅠ
그런 안되져 ㅋㅋ 왜냐면 그 다이얼로그는 현재 실행중인 액티비티 클래스 객체는 인자로 받아요
그니까 class myActivity extends Activity 이런식으로 클래스 하나 작성하시고, 이 클래스 인자로 받도록 해서 메소드 구현해두고
다른 액티비티 클래스들이 Activity 말고 myActivity 상속받도록 구현하시면 되여
그럼 님 말은 customadapter.java에서 customadapter클래스가 myActivity클래스를 상속받게 하면 된다는 말씀인가요?
그러니까 CustomAdapter는 Activity가 아니네요... 저기 보면 메인액티비티를 뉴해서 생성하는데 저러면 안되져
커스텀어댑터 객체 생성할때 메인액티비티 객체 넘기세여
근데 customadapter.java은 이미 ArrayAdaper<ListInfo>를 상속받고 잇는데 또 다른것도 상속받게 할 수 잇나요?;;
위에 작성한 내용은 제가 글 안 읽고 써서 헛소리 한거니까; 씹으셔도 됨;
커스텀어댑터 객체 생성하실때 메인 액티비티 클래스객체를 넘기셔서 하시면 될거 같아요
public class CustomAdapter extends ArrayAdapter<ListInfo> implements OnClickListener { public CustomAdapter(Context context, int layoutResource, ArrayList<ListInfo> objects)
이 위에서 어레이리스트 오브젝트 뒤에 MainActivity object <<--이거 추가하시란 말씀?;;
그러니까~ 라고 되있는 부분부터 보셈;;;
public CustomAdapter(Context context, int layoutResource, ArrayList<ListInfo> objects, MainActivity ma){}
아..미치겟네ㅠㅠ;
님말대로 저렇게 수정하고..onClick함수 안에서..ma.shodialog(CUSTOM_DIALOG); 햇는데 안되요;;
참고로 CUSTOM_DIALOG는 mainactivity.java 랑 customadapter.java 에 private static final int CUSTOM_DIALOG = 1; 로 선언해놧어요