使用 onItemClick 从 DialogFragment 中的 ListView 获取数据
Getting data from ListView in DialogFragment using onItemClick
我目前有一个带有 ImageButton 的 Fragment,可以打开一个 DialogFragment。这个 DialogFragment 是一个使用适配器的自定义列表,其中每个条目都有一个 ImageView 和 TextView。
是否可以return选中项的ImageView的"src"到打开DialogFragment的Fragment?我需要将 ImageButton 的 src 更改为所选图像。
我调用 DialogFragment 的主要片段:
ImageButton starter = (ImageButton) myView.findViewById(R.id.imageStarterItem);
starter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
//Here
ItemPhysStarterFragment dialog = ItemPhysStarterFragment.newInstance();
dialog.show(getFragmentManager(), "fragmentDialog");
}
});
我的 DialogFragment class 包含 ListView:
public class ItemPhysStarterFragment extends DialogFragment {
Button btn;
ListView lv;
SearchView sv;
ArrayAdapter<String> adapter;
String[] names={"Bumba's Mask", "Rangda's Mask", "Bluestone Pendant", "Death's Toll",
"Mark of the Vanguard", "Swift Wing", "War Flag", "Watcher's Gift"};
int[] images={R.drawable.bumbas_mask, R.drawable.rangdas_mask, R.drawable.bluestone_pendant, R.drawable.deaths_toll,
R.drawable.mark_of_the_vanguard, R.drawable.swift_wing, R.drawable.war_flag, R.drawable.watchers_gift};
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View myView=inflater.inflate(R.layout.item_list, null);
//SET TITLE DIALOG TITLE
getDialog().setTitle("Starter Items");
//BUTTON,LISTVIEW,SEARCHVIEW INITIALIZATIONS
lv=(ListView) myView.findViewById(R.id.listView1);
sv=(SearchView) myView.findViewById(R.id.searchView1);
btn=(Button) myView.findViewById(R.id.dismiss);
//CREATE AND SET ADAPTER TO LISTVIEW
final Adapter adapter = new Adapter(getActivity(), this.getItems());
lv.setAdapter(adapter);
//SEARCH
sv.setQueryHint("Search starter items..");
sv.setOnQueryTextListener(new OnQueryTextListener() {
public boolean onQueryTextSubmit(String txt) {
return false;
}
public boolean onQueryTextChange(String txt) {
adapter.getFilter().filter(txt);
return false;
}
});
//BUTTON
btn.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
dismiss();
}
});
return myView;
}
public static ItemPhysStarterFragment newInstance(){
ItemPhysStarterFragment f = new ItemPhysStarterFragment();
return f;
}
private ArrayList<Item> getItems() {
ArrayList<Item> items = new ArrayList<Item>();
Item item;
for(int i = 0; i < names.length; i++)
{
item = new Item(names[i], images[i]);
items.add(item);
}
return items;
}
}
你可以声明一个接口
public interface OnCustomItemClickListener {
void onItemClicked(final String src);
}
并在创建对话框时实现该接口
(...),new OnCustomItemClickListener() {
@Override
public void onItemClicked() {
//do something
}
}, (...)
并在您的 ItemPhysStarterFragment 上适当地处理它 class
先创建一个接口
public interface OnListItemClickedListener {
void onListItemClick(int resourceId);
}
为 interface
创建 setter
public class ItemPhysStarterFragment extends DialogFragment {
OnListItemClickedListener mListener;
public void setOnListItemSelectedListener(OnListItemClickedListener listener) {
this.mListener = listener;
}
}
现在将 Listener 设置为您的 fragment
ItemPhysStarterFragment dialog = ItemPhysStarterFragment.newInstance();
dialog.setOnListItemSelectedListener(new OnListItemClickedListener() {
@Override
public void onListItemClick(int resourceId) {
// User your resourceId
}
});
dialog.show(getFragmentManager(), "fragmentDialog");
最后一步,在 ItemPhysStarterFragment
片段的 ListItemClick() 中触发侦听器 -
...public void onListItemClick(int resourceId) {
mListener.onListItemClick(pass your resource id);
}
这个 link 帮助我实现了@Wizzard 提出的相同结果。
基本上提出了相同的解决方案,只是不需要创建自定义界面。
在你的fragment class
中创建一个变量和setter方法来接受OnItemClickListener
private android.widget.AdapterView.OnItemClickListener onItemClickListener;
public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
在 fragement class
中确保 listView
设置项目点击侦听器:
list.setOnItemClickListener(onItemClickListener);
终于在你main class
可以调用了listviewItemClickListener
:
DialogMyListFragment df = new DialogMyListFragment().getInstance();
df.setOnItemClickListener(listener);
我目前有一个带有 ImageButton 的 Fragment,可以打开一个 DialogFragment。这个 DialogFragment 是一个使用适配器的自定义列表,其中每个条目都有一个 ImageView 和 TextView。
是否可以return选中项的ImageView的"src"到打开DialogFragment的Fragment?我需要将 ImageButton 的 src 更改为所选图像。
我调用 DialogFragment 的主要片段:
ImageButton starter = (ImageButton) myView.findViewById(R.id.imageStarterItem);
starter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
//Here
ItemPhysStarterFragment dialog = ItemPhysStarterFragment.newInstance();
dialog.show(getFragmentManager(), "fragmentDialog");
}
});
我的 DialogFragment class 包含 ListView:
public class ItemPhysStarterFragment extends DialogFragment {
Button btn;
ListView lv;
SearchView sv;
ArrayAdapter<String> adapter;
String[] names={"Bumba's Mask", "Rangda's Mask", "Bluestone Pendant", "Death's Toll",
"Mark of the Vanguard", "Swift Wing", "War Flag", "Watcher's Gift"};
int[] images={R.drawable.bumbas_mask, R.drawable.rangdas_mask, R.drawable.bluestone_pendant, R.drawable.deaths_toll,
R.drawable.mark_of_the_vanguard, R.drawable.swift_wing, R.drawable.war_flag, R.drawable.watchers_gift};
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View myView=inflater.inflate(R.layout.item_list, null);
//SET TITLE DIALOG TITLE
getDialog().setTitle("Starter Items");
//BUTTON,LISTVIEW,SEARCHVIEW INITIALIZATIONS
lv=(ListView) myView.findViewById(R.id.listView1);
sv=(SearchView) myView.findViewById(R.id.searchView1);
btn=(Button) myView.findViewById(R.id.dismiss);
//CREATE AND SET ADAPTER TO LISTVIEW
final Adapter adapter = new Adapter(getActivity(), this.getItems());
lv.setAdapter(adapter);
//SEARCH
sv.setQueryHint("Search starter items..");
sv.setOnQueryTextListener(new OnQueryTextListener() {
public boolean onQueryTextSubmit(String txt) {
return false;
}
public boolean onQueryTextChange(String txt) {
adapter.getFilter().filter(txt);
return false;
}
});
//BUTTON
btn.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
dismiss();
}
});
return myView;
}
public static ItemPhysStarterFragment newInstance(){
ItemPhysStarterFragment f = new ItemPhysStarterFragment();
return f;
}
private ArrayList<Item> getItems() {
ArrayList<Item> items = new ArrayList<Item>();
Item item;
for(int i = 0; i < names.length; i++)
{
item = new Item(names[i], images[i]);
items.add(item);
}
return items;
}
}
你可以声明一个接口
public interface OnCustomItemClickListener {
void onItemClicked(final String src);
}
并在创建对话框时实现该接口
(...),new OnCustomItemClickListener() {
@Override
public void onItemClicked() {
//do something
}
}, (...)
并在您的 ItemPhysStarterFragment 上适当地处理它 class
先创建一个接口
public interface OnListItemClickedListener {
void onListItemClick(int resourceId);
}
为 interface
public class ItemPhysStarterFragment extends DialogFragment {
OnListItemClickedListener mListener;
public void setOnListItemSelectedListener(OnListItemClickedListener listener) {
this.mListener = listener;
}
}
现在将 Listener 设置为您的 fragment
ItemPhysStarterFragment dialog = ItemPhysStarterFragment.newInstance();
dialog.setOnListItemSelectedListener(new OnListItemClickedListener() {
@Override
public void onListItemClick(int resourceId) {
// User your resourceId
}
});
dialog.show(getFragmentManager(), "fragmentDialog");
最后一步,在 ItemPhysStarterFragment
片段的 ListItemClick() 中触发侦听器 -
...public void onListItemClick(int resourceId) {
mListener.onListItemClick(pass your resource id);
}
这个 link 帮助我实现了@Wizzard 提出的相同结果。
基本上提出了相同的解决方案,只是不需要创建自定义界面。
在你的
fragment class
中创建一个变量和setter方法来接受OnItemClickListener
private android.widget.AdapterView.OnItemClickListener onItemClickListener;
public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
在
fragement class
中确保listView
设置项目点击侦听器:list.setOnItemClickListener(onItemClickListener);
终于在你
main class
可以调用了listviewItemClickListener
:DialogMyListFragment df = new DialogMyListFragment().getInstance();
df.setOnItemClickListener(listener);