我有一个包含项目类别的列表视图。当我按下列表中的类别标题时,它将显示另一个列表视图,其中包含所选类别中的项目。
我是通过使用ListFragment来做到这一点的。我是否必须开始一项新活动并在意图中将类别ID一起传递?
这是我的ListFragment
类别:
public class CategoryFragment extends ListFragment implements
OnItemClickListener {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
getListView().setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
// what to do here
}
}
我在onItemClick
添加什么内容才能转到商品列表?我是否需要使用另一个ListFragment或只使用常规ListActivity?
如何从解析的JSON中检索类别ID并将其传递给List项?
编辑:我使用Volley解析了JSON。我正在考虑在类别ID的布局中创建一个不可见的TextView,以便我可以从那里拉出它。这可能吗?
答案 0 :(得分:2)
您应该使用Interface
,这是将值传递给Fragment
的“官方”方式。
请在此处查看此文档:
http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity
所以你需要做的是:
FragmentA - &gt;活动 - &gt; FragmentB
隐形TextView
绝对不是正确的解决方案......
编辑更详细的解决方案:
您定义了一个接口(在单独的文件中或在FragmentA类中):
public interface MyFragmentListener {
public void onFragmentItemSelected(String url);
}
你的FragmentA课程中的:
MyFragmentListener myListener;
public void setMyFragmentListener(MyFragmentListener listener) {
myListener = listener;
}
// here I used the onClick method but you can call the listener whereever you like.
public void onClick(View view) {
if (myListener != null) {
myListener.onFragmentItemSelected(url);
}
}
声明你的FragmentB类:
public class FragmentB extends Fragment implements MyFragmentListener {
public void onFragmentItemSelected(String url) {
// do what you want to do
}
}
在您的活动中:
// you tell your fragmentA that his listener is the FragmentB. And because you implemented the listener in FragmentB, everything is allright;
fragmentA.setMyFragmentListener(fragmentB));
答案 1 :(得分:1)
使用此........
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// getting values from selected ListItem
int new_position = position;
String disp = dataList.get(new_position).get("displaytext");
String msg = dataList.get(new_position).get("message");
String pht = dataList.get(new_position).get("photo");
String mt = dataList.get(new_position).get("messagetime");
String fpht = dataList.get(new_position).get("feedphoto");
String prdctprice = dataList.get(new_position).get(
"productprice");
String pid = dataList.get(new_position).get("productid");
String cmntcount = dataList.get(new_position).get(
"commentcount");
String storeid = dataList.get(new_position).get("storeid");
addfragment(new FeedChat(c, disp, msg, pht, mt, fpht,
prdctprice, pid, storeid, cmntcount), true,
FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
}
});
答案 2 :(得分:1)
让您的FragmentActivity
实现具有categorySelected(int categoryId)
方法的界面。
在CategoryOverviewFragment中,您在选择类别时调用此方法:
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
((CategorySelectedListener)getActivity()).categorySelected(i);
}
然后,在您实施categorySelected
的活动中,将概述片段替换为CategoryFragment
。
创建CategoryFragment
时,请将cateogry ID设置为参数。最好使用newInstance pattern到setArguments()
。
要使用类别详细信息片段替换类别概览列表片段,请使用FragmentManager
至beginTransaction()
,然后replace()
。
假设类别概述片段是动态添加的而不是XML格式,请使用以下代码:
CategoryFragment newFragment = CategoryFragment.newInstance(categoryIdSelected);
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
transaction.commit();
如果在XML中添加了类别列表片段,则需要将其删除,将其更改为FrameLayout
并在代码中动态添加片段。
答案 3 :(得分:0)
使用Fragment
Activity
完成两个Interface
之间的通信
Fragment
A --------------------------&gt; Activity
-------- ------------&gt; Fragment
B
(定义{{1}})(实现Interface
)(传递给interface
B)