两个片段之间的 onItemClickListener
Posted
技术标签:
【中文标题】两个片段之间的 onItemClickListener【英文标题】:onItemClickListener between two fragments 【发布时间】:2014-01-08 03:12:12 【问题描述】:我对 android 非常陌生。我已经尝试过但无法找出我缺少的东西。我正在使用两个片段,两个显示列表。现在我想在用户单击第一个列表项时更改第二个片段中的列表数据。默认情况下,将选择零位置索引以显示第二个列表中的数据。我正在使用自定义数组适配器在两个片段中显示列表。请帮帮我。谢谢考虑。 我在这里粘贴我的代码:
活动类:
public class ProductListActivity extends Activity implements ProductInterface
public static String cookie;
public static String jsonSettingsResponse;
public static String[] tids;
public static String jsonPorductsCategoryListResponseString;
public JSONArray jsonPorductsCategoryListResponseArray;
public static String vid;
public static String publicPath;
public static JSONArray productsList;
public ArrayList<String> listItems;
public String[] listProCategory;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.product_category_and_list);
Intent intent = getIntent();
cookie = intent.getStringExtra(BConstant.WEB_SERVICES_COOKIES);
productsList = new JSONArray();
FetchProductCategories products = new FetchProductCategories();
productsList = products.fetchProducts();
listProCategory = products.onDisplayProductList(productsList).toArray(
new String[0]);
Bundle bundle = new Bundle();
bundle.putString(BConstant.WEB_SERVICES_COOKIES, cookie);
bundle.putString(BConstant.PUBLIC_PATH, publicPath);
bundle.putStringArray(BConstant.TAXONOMY_TID, tids);
bundle.putStringArray(BConstant.PRODUCT_CATEGORY_NAMES,
listProCategory);
ProductCategoryFragment.newInstance(bundle);
Bundle bundleForProductList = new Bundle();
bundleForProductList.putStringArray(BConstant.TAXONOMY_TID, tids);
bundleForProductList.putString(BConstant.WEB_SERVICES_COOKIES, cookie);
ProductListFragment.newInstance(bundleForProductList);
private class FetchProductCategories
protected JSONArray fetchProducts(String... params)
jsonSettingsResponse = WebserviceBUtil
.callWebServicesGetVocabularyList(cookie);
vid = JSONUtil.parseJSONResponse(jsonSettingsResponse,
BConstant.TAXONOMY_VID);
publicPath = JSONUtil.parseJSONResponse(jsonSettingsResponse,
BConstant.PUBLIC_PATH);
jsonPorductsCategoryListResponseString = WebserviceBUtil
.callWebServicesGetProductsCategoryList(cookie, vid);
tids = ProductCategoryIds.parseJSONResponseToGetTidsOfProducts(
jsonPorductsCategoryListResponseString,
BConstant.TAXONOMY_TID);
try
jsonPorductsCategoryListResponseArray = new JSONArray(
jsonPorductsCategoryListResponseString);
catch (JSONException e)
e.printStackTrace();
return jsonPorductsCategoryListResponseArray;
protected ArrayList<String> onDisplayProductList(JSONArray result)
listItems = new ArrayList<String>();
for (int i = 0; i < result.length(); i++)
try
listItems
.add(result.getJSONObject(i)
.getString(BConstant.NAME_CONSTANT)
.toString());
catch (Exception ex)
ex.printStackTrace();
return listItems;
@Override
public HashMap<Integer, Bitmap> DownloadImages(
HashMap<Integer, String> productCategoryImagePath)
HashMap<Integer, Bitmap> imgBitmap = new HashMap<Integer, Bitmap>();
for (int pos = 0; pos < productCategoryImagePath.size(); pos++)
Bitmap bval = ImageDownloader
.getBitmapFromURL(productCategoryImagePath.get(pos));
imgBitmap.put(pos, bval);
return imgBitmap;
@Override
public void clickedProductCategory(String tid)
FragmentManager productListFragmentManager = getFragmentManager();
ProductListFragment productListFragment = (ProductListFragment) productListFragmentManager
.findFragmentById(R.id.proListfragment);
productListFragment.clickedProductCategoryIdByProductCategoryFragment(tid);
第一个片段:
public class ProductCategoryFragment extends Fragment implements OnItemClickListener
ProductInterface productInterface;
private static String[] tids;
private static HashMap<Integer, String> productCategoryImagePath;
private static String jsonPorductsDetailsImagePathResponse;
private static String publicPath;
private static String cookie;
public static String[] listProCategory;
public ListView listOfProductsCategory;
private static HashMap<Integer, Bitmap> imgBitmapUrls;
DisplayProductCategoryListArrayAdapter adapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
View fragProcatView = inflater.inflate(R.layout.product_category_list, container,
false);
listOfProductsCategory =(ListView) fragProcatView .findViewById(R.id.productCategorylistView);
return fragProcatView;
@Override
public void onActivityCreated(Bundle savedInstanceState)
super.onActivityCreated(savedInstanceState);
productInterface = (ProductInterface) getActivity();
productCategoryImagePath = new HashMap<Integer, String>();
for (int i = 0; i < tids.length; i++)
jsonPorductsDetailsImagePathResponse = WebserviceBUtil
.callWebServicesGetProductsDetails(cookie, tids[i]);
String filename = ProductCategoryIds
.parseJSONResponseToGetVidOfProductsFromVocabulary(
jsonPorductsDetailsImagePathResponse,
BConstant.FILE_NAME);
String completeUrl = publicPath + filename;
productCategoryImagePath.put(i, completeUrl);
imgBitmapUrls = productInterface
.DownloadImages(productCategoryImagePath);
adapter = new DisplayProductCategoryListArrayAdapter(
getActivity(), listProCategory,
imgBitmapUrls);
listOfProductsCategory.setAdapter(adapter);
listOfProductsCategory.setOnItemClickListener(this);
static ProductCategoryFragment newInstance(Bundle bundle)
ProductCategoryFragment productCategoryFragment = new ProductCategoryFragment();
productCategoryFragment.setArguments(bundle);
cookie = bundle.getString(BConstant.WEB_SERVICES_COOKIES);
tids = bundle.getStringArray(BConstant.TAXONOMY_TID);
publicPath = bundle.getString(BConstant.PUBLIC_PATH);
listProCategory = bundle.getStringArray(BConstant.PRODUCT_CATEGORY_NAMES);
return productCategoryFragment;
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id)
String clickedItemName = (String) listOfProductsCategory
.getItemAtPosition(position);
int clickedItemId = (int) listOfProductsCategory
.getItemIdAtPosition(position);
Toast.makeText(this.getActivity(),
"Product is getting load : " + clickedItemName,
Toast.LENGTH_SHORT).show();
productInterface.clickedProductCategory(tids[clickedItemId]);
public class DisplayProductCategoryListArrayAdapter extends ArrayAdapter<String>
Context context;
HashMap<Integer, Bitmap> prodctImgs;
String[] proCategoryNames;
HashMap<Integer, Bitmap>biturls;
DisplayProductCategoryListArrayAdapter(Context c,
String[] listCategory, HashMap<Integer, Bitmap> imgUrls)
super(c,
R.layout.product_category_single_layout,
R.id.productCategoryName, listCategory);
this.context = c;
this.prodctImgs = imgUrls;
this.proCategoryNames = listCategory;
this.biturls = imgUrls;
@Override
public View getView(int position, View convertView, ViewGroup parent)
LayoutInflater inflater=((Activity)context).getLayoutInflater();
View row = inflater.inflate(R.layout.product_category_single_layout, parent, false);
ImageView productCategoryImage = (ImageView) row
.findViewById(R.id.productCategoryImageId);
Bitmap bitmap = imgBitmapUrls.get(position);
// productCategoryImage.setFocusable(false);
TextView productCategoryName = (TextView) row
.findViewById(R.id.productCategoryName);
productCategoryImage.setImageBitmap(bitmap);
productCategoryName.setText(proCategoryNames[position]);
return row;
第二个片段:
public class ProductListFragment extends Fragment implements OnItemClickListener
private static HashMap<Integer, Bitmap> imgBitmapUrls;
public ListView listOfProducts;
ProductInterface productInterfaceForProductList;
private static String jsonPorductsCategoryListResponse;
private static String cookie;
private static String[] productImgPath;
private static String[] nids;
private static String[] title;
private static String[] tids;
private String tid;
private static HashMap<Integer, String> productListImagePath;
DisplayProductListArrayAdapter proListAdapter;
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState )
View fragProListView = inflater.inflate(R.layout.product_category_list, container,
false);
listOfProducts =(ListView) fragProListView .findViewById(R.id.productCategorylistView);
return fragProListView;
@Override
public void onActivityCreated(Bundle savedInstanceState)
super.onActivityCreated(savedInstanceState);
productInterfaceForProductList = (ProductInterface) getActivity();
jsonPorductsCategoryListResponse = WebserviceBUtil.
callWebServicesGetProductsList(cookie, tids[0]);
nids = ProductCategoryIds.parseJSONResponseToGetTidsOfProducts(
jsonPorductsCategoryListResponse,
BConstant.PRODUCT_NODE_ID);
title = ProductCategoryIds.parseJSONResponseToGetTidsOfProducts(
jsonPorductsCategoryListResponse,
BConstant.PRODUCT_TITLE);
productImgPath = ProductCategoryIds.parseJSONResponseToGetTidsOfProducts(
jsonPorductsCategoryListResponse,
BConstant.PRODUCT_IMAGE);
productListImagePath = new HashMap<Integer, String>();
for(int i =0;i<productImgPath.length;i++)
productListImagePath.put(i, productImgPath[i]);
System.out.println(productListImagePath);
imgBitmapUrls = productInterfaceForProductList
.DownloadImages(productListImagePath);
proListAdapter = new DisplayProductListArrayAdapter(
getActivity(), title,
imgBitmapUrls);
listOfProducts.setAdapter(proListAdapter);
listOfProducts.setOnItemClickListener(this);
static ProductListFragment newInstance(Bundle bundle)
ProductListFragment productListFragment = new ProductListFragment();
productListFragment.setArguments(bundle);
cookie = bundle.getString(BConstant.WEB_SERVICES_COOKIES);
tids = bundle.getStringArray(BConstant.TAXONOMY_TID);
return productListFragment;
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
// TODO Auto-generated method stub
public class DisplayProductListArrayAdapter extends ArrayAdapter<String>
Context context;
HashMap<Integer, Bitmap> prodctImgs;
String[] proCategoryNames;
HashMap<Integer, Bitmap>biturls;
DisplayProductListArrayAdapter(Context c,
String[] listCategory, HashMap<Integer, Bitmap> imgUrls)
super(c,
R.layout.products_list_single_layout,
R.id.productCategoryName, listCategory);
this.context = c;
this.prodctImgs = imgUrls;
this.proCategoryNames = listCategory;
this.biturls = imgUrls;
@Override
public View getView(int position, View convertView, ViewGroup parent)
LayoutInflater inflater=((Activity)context).getLayoutInflater();
View row = inflater.inflate(R.layout.products_list_single_layout, parent, false);
ImageView productCategoryImage = (ImageView) row
.findViewById(R.id.productImageId);
Bitmap bitmap = imgBitmapUrls.get(position);
// productCategoryImage.setFocusable(false);
TextView productCategoryName = (TextView) row
.findViewById(R.id.productName);
productCategoryImage.setImageBitmap(bitmap);
productCategoryName.setText(proCategoryNames[position]);
return row;
public void clickedProductCategoryIdByProductCategoryFragment(String tid)
jsonPorductsCategoryListResponse = WebserviceBUtil.
callWebServicesGetProductsList(cookie, tid);
【问题讨论】:
【参考方案1】:您可以创建接口,作为第一个片段的侦听器和操作,并将操作传递给您的活动。
在您的 Activity 中,您可以更新第二个 Fragment 中的数据。
public interface IFoo
public void foo();
在第一个片段中
IFoo responder; //global variable
private ProductCategoryFragment(IFoo resp)
this.responder=resp;
static ProductCategoryFragment newInstance(Bundle bundle, IFoo resp)
ProductCategoryFragment productCategoryFragment = new ProductCategoryFragment(resp);
productCategoryFragment.setArguments(bundle);
cookie = bundle.getString(BsharpConstant.WEB_SERVICES_COOKIES);
tids = bundle.getStringArray(BsharpConstant.TAXONOMY_TID);
publicPath = bundle.getString(BsharpConstant.PUBLIC_PATH);
listProCategory = bundle.getStringArray(BsharpConstant.PRODUCT_CATEGORY_NAMES);
return productCategoryFragment;
还有一些在片段中
responder.foo();
在您的活动中
public class ProductListActivity extends Activity implements IFoo
...
public void foo()
//pass data to second fragment
onCreate
...
ProductCategoryFragment.newInstance(bundle, this);
使您的片段成为全局变量,以便随时访问它们
我希望它很清楚并且会有所帮助。如果不清楚,请随时提出其他问题:)
【讨论】:
Gooziec 你能看看我的代码吗。谢谢你的帮助。以上是关于两个片段之间的 onItemClickListener的主要内容,如果未能解决你的问题,请参考以下文章
使用OnItemClickListener将Listview Fragment分段为事务
传递嵌套在片段中的 AdapterView.OnItemClickListener() 中的活动上下文 - 方法未定义
将数据从片段列表视图项传递到活动字符串变量 onitemclicklistener