kbu
kbu

Reputation: 389

Get parent layout from custom Adapter

Could anybody explain me, how to realize? I have an activity with listview and footer with some elements(textview).

Listview built with custom adapter. Each listview item has few elements. And my question: how can i change textview in footer, from custom adapter, when i clicking on some listview's element?

Thx a lot!

/**** My adapter ****/

public class MyListAdapter extends ArrayAdapter<Product> implements UndoAdapter {

    private final Context mContext;
    private HashMap<Product, Integer> mIdMap = new HashMap<Product, Integer>();
    ArrayList<Product> products = new ArrayList<Product>();
    final int INVALID_ID = -1;
    LayoutInflater lInflater;
    String imagePath;

    public MyListAdapter(Context context, int textViewResourceId, List<Product> prod) {
        //super(context, textViewResourceId, prod);
        super(prod);
        lInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mContext = context;
        for (int i = 0; i < prod.size(); i++) {
            //add(prod.get(i));
            mIdMap.put(prod.get(i),i);
        }
    }

    @Override
    public long getItemId(final int position) {
        //return getItem(position).hashCode();
        Product item = (Product) getItem(position);
        return mIdMap.get(item);
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

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

        ViewHolder holder = null;;
        Product p = getItem(position);

        if (convertView == null) {

            convertView = lInflater.inflate(R.layout.item, null);
            //convertView.setBackgroundResource(R.drawable.rounded_corners);

            int currentTheme = Utils.getCurrentTheme(convertView.getContext());
            switch (currentTheme) {

                case 0:
                        convertView.setBackgroundResource(R.drawable.rounded_corners);
                    break;
                case 1:
                        convertView.setBackgroundResource(R.drawable.border);
                    break;
                default:
                        convertView.setBackgroundResource(R.drawable.rounded_corners);
                    break;

            }

            holder = new ViewHolder();

            holder.tvDescr = (TextView) convertView.findViewById(R.id.tvDescr);
            holder.list_image = (ImageView) convertView.findViewById(R.id.list_image);
            holder.products_amount = (TextView) convertView.findViewById(R.id.amountDigits);
            holder.products_price = (TextView) convertView.findViewById(R.id.priceDigits);
            holder.ivImage = (ImageView) convertView.findViewById(R.id.ivImage);
            holder.unit = (TextView) convertView.findViewById(R.id.unit);

            convertView.setTag(holder);

        } else {

            holder = (ViewHolder) convertView.getTag();

        }


        if(p.getProductImageBitmap() != null && p.getProductImageBitmap() != "") {
            Log.d("PATH -- ", p.getProductImageBitmap());
            ImageLoader imageLoader = ImageLoader.getInstance();
            DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true)
                    .resetViewBeforeLoading(true)
                    .showImageForEmptyUri(R.drawable.ic_launcher)
                    .showImageOnFail(R.drawable.ic_launcher)
                                                                        /*.showImageOnLoading(R.id.progress_circular)*/
                    .build();
            imageLoader.displayImage(p.getProductImageBitmap(), holder.list_image, options);
        } else {
            holder.list_image.setImageResource(R.drawable.ic_launcher);
        }


        holder.tvDescr.setText(p.getProductName());

        holder.ivImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                String deletedItem = getItem(position).getProductName();
                MyListAdapter.this.remove(getItem(position));

                if (MyListAdapter.this.getCount() > 0) {

                    Toast.makeText(mContext, deletedItem + " " + mContext.getString(R.string.deleted_item), Toast.LENGTH_SHORT).show();
                    MyListAdapter.this.notifyDataSetChanged();

                } else {

                    Toast.makeText(mContext,mContext.getString(R.string.sklerolist_empty), Toast.LENGTH_SHORT).show();

                }

            }
        });

        //Функционал для большой картинки продукта
        //открывается новое активити с большой картинкой
        holder.list_image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                imagePath = getItem(position).getProductImageBitmap();
                if(imagePath != null && imagePath != "") {
                    Pattern normalPrice = Pattern.compile("^file");
                    Matcher m2 = normalPrice.matcher(imagePath);
                    if (m2.find()) {
                        Intent myIntent = new Intent(view.getContext(), ViewImage.class).putExtra("imagePath", imagePath);
                        view.getContext().startActivity(myIntent);
                    }
                }
            }
        });

        holder.products_price.setText(fmt(p.getProductPrice()));
        holder.products_amount.setText(fmt(p.getProductAmount()));
        holder.unit.setText(p.getProductUnit());

        return convertView;
    }

    public static String fmt(double d){
        if(d == (long) d)
            return String.format("%d",(long)d);
        else
            return String.format("%s",d);
    }

    static class ViewHolder {
        ImageView list_image;
        TextView tvDescr;
        TextView products_amount;
        TextView products_price;
        TextView unit;
        ImageView ivImage;
        ProgressBar circleProgress;
    }

    @NonNull
    @Override
    public View getUndoView(final int position, final View convertView, @NonNull final ViewGroup parent) {
        View view = convertView;
        if (view == null) {
            //view = LayoutInflater.from(mContext).inflate(R.layout.undo_row, parent, false);
            view = lInflater.inflate(R.layout.undo_row, parent, false);
        }
        return view;
    }

    @NonNull
    @Override
    public View getUndoClickView(@NonNull final View view) {
        return view.findViewById(R.id.undo_row_undobutton);
    }

    public View getHeaderView(final int position, final View convertView, final ViewGroup parent) {
        TextView view = (TextView) convertView;
        //View view = convertView;
        if (view == null) {
            //view = (TextView) LayoutInflater.from(mContext).inflate(R.layout.list_header, parent, false);
            //view = lInflater.inflate(R.layout.list_header, parent, false);
        }

        //view.setText(mContext.getString(R.string.header, getHeaderId(position)));

        return view;
    }

    public long getHeaderId(final int position) {
        return position / 10;
    }

}

Upvotes: 2

Views: 2509

Answers (1)

Aurelian Cotuna
Aurelian Cotuna

Reputation: 3081

Your ListView has a listener for the click events on list elements.

@Override  
public void onListItemClick(ListView l, View v, int position, long id) {
    // Do something when a list item is clicked 
} 

But if you want to pas something else back from the adapter to the Activity or the Fragment that contains that ListView and Adapter, you should create a simple interface and set it as listener to your adapter. After that, set click events on your rows from within the adapter, and notify the Activity or Fragment using your own interface.

For example you have the interface defined like this

public interface OnItemClickedCustomAdapter {
   public void onClick(ItemPosition position);
}

and in your Adapter class you will have a private member

private OnItemClickedCustomAdapter mListener;

and a method used to set the listener

public void setOnItemClickedCustomAdapter(OnItemClickedCustomAdapter listener){
    this.mListener = listener;
}

From your Activity or Fragment where your ListView is defined, and your adapter is set, you will be able to call setOnItemClickedCustomAdapter with this as parameter, and there you go. Your activity will now listen for your events. To trigger an event, just call mListener.onClick() from your custom adapter. You can pass back data you need back to the Activity or Fragment, and from there you have access to your Header or Footer directly, and you can change the text on them.

Upvotes: 3

Related Questions