如何使listView中的BaseAdapter中的按钮显示alertDialog,我试过但是它停止工作意外(运行时错误)我的代码如下所示。
任何建议
提前致谢
Monerah
====更新后=====================
import java.util.List;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MyCasesListAdapter extends BaseAdapter {
private Context context;
private List<MyCaseClass> listOfCases;
// TODO delete it not imp.
public MyCasesListAdapter() {
super();
}
public MyCasesListAdapter(Context context, List<MyCaseClass> listPhonebook) {
this.context = context;
this.listOfCases = listPhonebook;
}
public int getCount() {
return listOfCases.size();
}
public Object getItem(int position) {
return listOfCases.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup viewGroup) {
MyCaseClass entry = listOfCases.get(position);
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.mypage_row, null);
}
// this is row items..
// Set the onClick Listener on this button
Button ConfExpandRegion = (Button) convertView.findViewById(R.id.expand);
Button Cancelb = (Button) convertView.findViewById(R.id.cancelCase);
TextView tvCase = (TextView) convertView.findViewById(R.id.mypage_name);
//To be a clickable button
ConfExpandRegion.setFocusableInTouchMode(false);
ConfExpandRegion.setFocusable(false);
//For Dialog
AlertDialog alertDialog = new AlertDialog.Builder(MyCasesListAdapter.this);
alertDialog.setTitle("Conformation");
alertDialog.setMessage("Are you sure you want to do ???");
ConfExpandRegion.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
alertDialog.setButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// Some code
//ConfExpandRegion.setEnabled(false);
}
});
alertDialog.setButton2("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// here you can add functions
// Do nothing
}
});
alertDialog.setIcon(android.R.drawable.ic_dialog_alert);
alertDialog.show();
}});
//To be a clickable button
Cancelb.setFocusableInTouchMode(false);
Cancelb.setFocusable(false);
Cancelb.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
MyCaseClass entry = (MyCaseClass) v.getTag();
listOfCases.remove(entry);
// listPhonebook.remove(view.getId());
notifyDataSetChanged();
}
});
// Set the entry, so that you can capture which item was clicked and
// then remove it
// As an alternative, you can use the id/position of the item to capture
// the item
// that was clicked.
ConfExpandRegion.setTag(entry);
Cancelb.setTag(entry);
// btnRemove.setId(position);
return convertView;
}
public void onClick(View view) {
MyCaseClass entry = (MyCaseClass) view.getTag();
listOfCases.remove(entry);
// listPhonebook.remove(view.getId());
notifyDataSetChanged();
}
private void showDialog(MyCaseClass entry) {
// Create and show your dialog
// Depending on the Dialogs button clicks delete it or do nothing
}
public void add(MyCaseClass myCaseClass) {
// TODO Auto-generated method stub
listOfCases.add(myCaseClass);
}
}
// ============================================= ===============================
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
public class MyPage extends Activity {
Button createForm;
Button ConfExpandRegion, Cancelb;
String ExpandMsg, CancelMsg;
boolean b;
MyCaseClass mycase;
TextView tvCase;
AlertDialog alertDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mypage);
// Moving to anther activity
createForm = (Button) findViewById(R.id.creat_new_formbtn);
createForm.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent j = new Intent(MyPage.this, CreateNewForm.class);
startActivity(j);
}
});
// ============================================================================================
// for list
ListView list = (ListView) findViewById(R.id.mypage_list);
list.setClickable(true);
final List<MyCaseClass> listOfPhonebook = new ArrayList<MyCaseClass>();
MyCasesListAdapter adapter = new MyCasesListAdapter(this, listOfPhonebook);
for (MyCaseClass m : All_Static.getMyCaseList())
adapter.add(new MyCaseClass(m));
// after fill the adapter.. assign the list to the adapter
list.setAdapter(adapter);
list.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View view, int position, long index) {
System.out.println("sadsfsf");
;
}
});
list.setAdapter(adapter);
// ========================================================================================
}
public void sendSMS(String number, String msg) throws Exception {
if (!b) {
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(number, null, msg, null, null);
}
b = true;
}
// ========================================================================
}
答案 0 :(得分:9)
在创建适用于传递活动的适配器时,您是否100%确定将“this”作为参数传递?
检查的一个好方法是像这样修改应用程序:
将Activity参数添加到适配器
private Context context;
private Activity parentActivity;
...
public MyCasesListAdapter(Context context, List<MyCaseClass> listPhonebook, Activity parentActivity) {
this.context = context;
this.listOfCases = listPhonebook;
this.parentActivity = parentActivity;
}
像这样创建警告对话框......
AlertDialog alertDialog = new AlertDialog.Builder(parentActivity);
最后,像这样调用你的适配器的构造函数......
MyCasesListAdapter adapter = new MyCasesListAdapter(this, listOfPhonebook, MyPage.this);
说明:您可能不需要将Activity和Context传递给基本适配器,但我这样做只是为了让您暂时保留其他所有内容。我不确定当你实例化你的适配器时,“this”实际上是一个活动。我将构造函数中的第3个参数定义为“Activity”以强制您传入Activity。如果您尝试传递非活动和活动的内容,您将收到编译错误,因此它应该可以帮助您。
另外,我刚注意到,但问题可能是你的更新代码仍在尝试使用MyCasesListAdapter.this创建AlertDialog作为上下文,这不是一个活动。
答案 1 :(得分:5)
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(view.getRootView().getContext());
alertDialogBuilder.setMessage("Are you sure you want to delete?");
alertDialogBuilder.setPositiveButton("Ok",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
deleteExp(tid);
}
});
alertDialogBuilder.setNegativeButton("cancel",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
答案 2 :(得分:1)
你的 alertDialog 首先没有初始化..所以NPE ..当你在适配器中创建它时,一定要使用activity context and not ApplciatioContext
AlertDialog alertDialog = new AlertDialog.Builder(YourACtivity.this);
上面的行不应该在类级别..它应该在getView()
方法内...并将您的活动实例用作上下文..类似于nameOfYourActivity.this
答案 3 :(得分:0)
您必须使用AlertDialog.Builder
来构建AlertDialog
。