Search code examples
androidarraylistandroid-arrayadapter

Retrieving element in an ArrayList Adapter


I have created a listview that has an image and a button - I am using ArrayAdapter to view the items in the listview.

When I click on the button I would like to get the details of the item clicked.

So I tried the following:

pd = productList.get(position);

Where productList is ArrayList<ProductDetails> productList;

getproductdetailsbutton is a button in productListadapter extends ArrayAdapter<ProductDetails>

holder.getproductdetailsbutton.setOnClickListener(new View.OnClickListener() 
{
     @Override
     public void onClick(View v) {

            String productID = pd.getProductID();
            String productName = pd. getProductName();

            Log.d("Value", " Product Details " + productID + " " + productName);
        }
 });

When I click the button from the first item, I get details of the last item displayed on the screen in the log.

How do I get the details of clicked item for that position?

Thanks!

UPDATE: getVIEW Code:

@Override
    public View getView(final int position, View convertView, final ViewGroup parent)
    {

        Typeface tf = Typeface.createFromAsset(contextValue.getAssets(), fontPath);
        Typeface tf2 = Typeface.createFromAsset(contextValue.getAssets(), fontPath2);

        ViewHolder holder = null;

        if (convertView == null)
        {

            convertView = vi.inflate(R.layout.product_details_items, null);

            holder = new ViewHolder();
            holder.image = (ImageView) convertView.findViewById(R.id.productimage);
            holder.productgetdetails = (Button) convertView.findViewById(R.id.productgetdetails);
            holder.productgetdetails.setTag(position);    

            holder.productgetdetails.setTypeface(tf2);

            convertView.setTag(holder);

            ProductDetails pd = productList.get(position);

            if (pinexist.equalsIgnoreCase(contextValue.getString(R.string.pinexistvalue)))
            {
                Log.d("Value"," - ID " + pd.getProductID());

                if (logdb.checkproductDetailsExists(pd.getProductID()) == 0)
                {
                    holder.productgetdetails.setOnClickListener(new View.OnClickListener() {

                        @Override
                        public void onClick(View v)
                        {
                            Log.e("Value", " = FINAL" + productList.get(position).getProductID());
                        }
                    });
                }
                else
                {
                    holder.productgetdetails.setText(contextValue.getString(R.string.nodata));
                }

            }
            else
            {
                //DO NOTHING
            }
        }
        else
        {
            holder = (ViewHolder) convertView.getTag();
        }

        ProductDetails pd = productList.get(position);

        Glide.with(getContext().getApplicationContext())
                .load(pd.getProduct_image())
                .placeholder(R.drawable.placeholder)
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .skipMemoryCache(true)
                .into(holder.image);


        return convertView;
    }

Solution

  • I guess(actually I'm confident), you must be declaring pd as global variable, which gets updated by last item displayed, try to move pd into getView() and mark it as final so you can use it inside onclick as in

    public void getView(){
       final ProductDetails pd = productList.get(position);
       // your code for click
    }