想要在带有 onClick 侦听器和 onLongClickListener 的警报对话框中有一个列表视图
Want to have a list view in an alert dialog box with both onClick listener and onLongClickListener
要创建带有列表视图的警报对话框,我使用了以下代码:
ArrayList<String> namesAL = dbHandler.getArrayListOFnames();
final ListAdapter m_Adapter = new ArrayAdapter<String>(fragment_console.this,android.R.layout.simple_expandable_list_item_1, namesAL);
builderSingle.setAdapter(
m_Adapter,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
destloc = getLocLatLng(which);
destlat = destloc.latitude;
destlng = destloc.longitude;
gotoLocation(destlat, destlng, 14);
if (marker != null) {
marker.remove();
}
if (circle != null){
circle.remove();
circle = null;
}
MarkerOptions options = new MarkerOptions()
.title("Your destination")
.position(destloc)
.position(destloc)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.dest_marker));
marker = map.addMarker(options);
onDestinationChanged();
dialog.cancel(); }
});
builderSingle.show();
但这限制了我只能使用OnClickListener,没有长按监听的选项。我也需要一个长按监听器,以便用户可以从我提供的列表中删除一个条目(实际上仅由用户创建)。如何做到这一点?
在构建对话框之后,在显示之前,您可以这样做:
alertDialog.getListView().setOnLongClickListener(...);
https://developer.android.com/reference/android/app/AlertDialog.html#getListView()
编辑:添加更多代码以阐明操作
这是添加侦听器的代码。为了从列表中获取正确的对象,您应该将对象本身作为标签添加到视图中。
//[your code from above here...]
AlertDialog alertDialog = builderSingle.create();
alertDialog.getListView().setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
//your removeing code here
YourObject yObj = (YourObject) v.getTag();
yourList.renmove(yObj);
return true;
}
});
alertDialog.show();
你需要用ListView制作自己的DialogFragment,但最好是RecyclerView。
示例:
public class MyDialogFragment extends DialogFragment {
private RecyclerView mRecyclerView;
private MyRecyclerAdapter adapter;
// this method create view for your Dialog
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//inflate layout with recycler view
View v = inflater.inflate(R.layout.fragment_dialog, container, false);
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//setadapter
CustomAdapter adapter = new MyRecyclerAdapter(context, customList);
mRecyclerView.setAdapter(adapter);
//get your recycler view and populate it.
return v;
}
}
在这里您可以找到如何创建 RecyclerView 适配器,http://www.androidhive.info/2016/01/android-working-with-recycler-view/
你可以这样显示这个片段:
MyDialogFragment dialogFragment = new MyDialogFragment();
dialogFragment.show(getFragmentManager(), "dialogFragment");
// TODO Auto-generated method stub
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(
ListAlertDailog.this);
alertBuilder.setIcon(R.drawable.ic_launcher);
alertBuilder.setTitle("Select Mobile OS:-");
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
ListAlertDailog.this,
android.R.layout.select_dialog_item);
arrayAdapter.add("Android");
arrayAdapter.add("IOS");
arrayAdapter.add("Windows");
arrayAdapter.add("Bada");
arrayAdapter.add("BlackBerry OS");
arrayAdapter.add("Symbian OS");
alertBuilder.setNegativeButton("Cancle",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
dialog.dismiss();
}
});
alertBuilder.setAdapter(arrayAdapter,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
String strOS = arrayAdapter.getItem(which);
Toast.makeText(getApplicationContext(),
"On click selected " + strOS, Toast.LENGTH_SHORT)
.show();
dialog.dismiss();
}
});
final AlertDialog alertDialog = alertBuilder.create();
alertDialog.setOnShowListener(new OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
// TODO Auto-generated method stub
ListView listView = alertDialog.getListView();
listView.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(
AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
String strOS = arrayAdapter.getItem(position);
Toast.makeText(getApplicationContext(),
"Long Press - Deleted Entry " + strOS,
Toast.LENGTH_SHORT).show();
alertDialog.dismiss();
return true;
}
});
}
});
alertDialog.show();
添加项目长按处理程序的简单方法
AlertDialog dialog = new Builder(mContext)
.setTitle(HISTORY_LIST_DIALOG_TITLE)
.setAdapter(historyAdapter, (dialog, index) -> {
// OnItemClickListener
})
.create();
// Long click listener must be added after builder creation
dialog.getListView().setOnItemLongClickListener((parent, view, index, id) -> {
// Handle item long click here
dialog.dismiss(); // Not required, but recommended
return true;
});
dialog.show();
要创建带有列表视图的警报对话框,我使用了以下代码:
ArrayList<String> namesAL = dbHandler.getArrayListOFnames();
final ListAdapter m_Adapter = new ArrayAdapter<String>(fragment_console.this,android.R.layout.simple_expandable_list_item_1, namesAL);
builderSingle.setAdapter(
m_Adapter,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
destloc = getLocLatLng(which);
destlat = destloc.latitude;
destlng = destloc.longitude;
gotoLocation(destlat, destlng, 14);
if (marker != null) {
marker.remove();
}
if (circle != null){
circle.remove();
circle = null;
}
MarkerOptions options = new MarkerOptions()
.title("Your destination")
.position(destloc)
.position(destloc)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.dest_marker));
marker = map.addMarker(options);
onDestinationChanged();
dialog.cancel(); }
});
builderSingle.show();
但这限制了我只能使用OnClickListener,没有长按监听的选项。我也需要一个长按监听器,以便用户可以从我提供的列表中删除一个条目(实际上仅由用户创建)。如何做到这一点?
在构建对话框之后,在显示之前,您可以这样做:
alertDialog.getListView().setOnLongClickListener(...);
https://developer.android.com/reference/android/app/AlertDialog.html#getListView()
编辑:添加更多代码以阐明操作
这是添加侦听器的代码。为了从列表中获取正确的对象,您应该将对象本身作为标签添加到视图中。
//[your code from above here...]
AlertDialog alertDialog = builderSingle.create();
alertDialog.getListView().setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
//your removeing code here
YourObject yObj = (YourObject) v.getTag();
yourList.renmove(yObj);
return true;
}
});
alertDialog.show();
你需要用ListView制作自己的DialogFragment,但最好是RecyclerView。
示例:
public class MyDialogFragment extends DialogFragment {
private RecyclerView mRecyclerView;
private MyRecyclerAdapter adapter;
// this method create view for your Dialog
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//inflate layout with recycler view
View v = inflater.inflate(R.layout.fragment_dialog, container, false);
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//setadapter
CustomAdapter adapter = new MyRecyclerAdapter(context, customList);
mRecyclerView.setAdapter(adapter);
//get your recycler view and populate it.
return v;
}
}
在这里您可以找到如何创建 RecyclerView 适配器,http://www.androidhive.info/2016/01/android-working-with-recycler-view/
你可以这样显示这个片段:
MyDialogFragment dialogFragment = new MyDialogFragment();
dialogFragment.show(getFragmentManager(), "dialogFragment");
// TODO Auto-generated method stub
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(
ListAlertDailog.this);
alertBuilder.setIcon(R.drawable.ic_launcher);
alertBuilder.setTitle("Select Mobile OS:-");
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
ListAlertDailog.this,
android.R.layout.select_dialog_item);
arrayAdapter.add("Android");
arrayAdapter.add("IOS");
arrayAdapter.add("Windows");
arrayAdapter.add("Bada");
arrayAdapter.add("BlackBerry OS");
arrayAdapter.add("Symbian OS");
alertBuilder.setNegativeButton("Cancle",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
dialog.dismiss();
}
});
alertBuilder.setAdapter(arrayAdapter,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
String strOS = arrayAdapter.getItem(which);
Toast.makeText(getApplicationContext(),
"On click selected " + strOS, Toast.LENGTH_SHORT)
.show();
dialog.dismiss();
}
});
final AlertDialog alertDialog = alertBuilder.create();
alertDialog.setOnShowListener(new OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
// TODO Auto-generated method stub
ListView listView = alertDialog.getListView();
listView.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(
AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
String strOS = arrayAdapter.getItem(position);
Toast.makeText(getApplicationContext(),
"Long Press - Deleted Entry " + strOS,
Toast.LENGTH_SHORT).show();
alertDialog.dismiss();
return true;
}
});
}
});
alertDialog.show();
添加项目长按处理程序的简单方法
AlertDialog dialog = new Builder(mContext)
.setTitle(HISTORY_LIST_DIALOG_TITLE)
.setAdapter(historyAdapter, (dialog, index) -> {
// OnItemClickListener
})
.create();
// Long click listener must be added after builder creation
dialog.getListView().setOnItemLongClickListener((parent, view, index, id) -> {
// Handle item long click here
dialog.dismiss(); // Not required, but recommended
return true;
});
dialog.show();