两个片段之间的 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

片段内的 RecyclerView 的 Kotlin OnItemClickListener

无法从 onListItemClick 开始片段

替换的片段在背景上仍然可见