从自定义适配器获取父布局

Get parent layout from custom Adapter

谁能解释一下,怎么实现的? 我有一个 activity 与列表视图和页脚与一些元素 (textview)。

使用自定义适配器构建的列表视图。每个列表视图项目都有几个元素。我的问题是:当我单击某些列表视图的元素时,如何从自定义适配器更改页脚中的文本视图?

非常感谢!

/**** 我的适配器 ****/

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;
    }

}

您的 ListView 有一个监听列表元素的点击事件的监听器。

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

但是,如果您想将其他东西从适配器传回 Activity 或包含 ListViewAdapterFragment,您应该创建一个简单的界面并将其设置为适配器的侦听器。之后,从适配器中在您的行上设置点击事件,并使用您自己的界面通知 ActivityFragment

例如你有这样定义的接口

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

并且在您的 Adapter class 中您将拥有一个私人成员

private OnItemClickedCustomAdapter mListener;

以及用于设置侦听器的方法

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

从您的 ActivityFragment 中定义了 ListView 并设置了适配器,您将能够使用 [=26= 调用 setOnItemClickedCustomAdapter ] 作为参数,然后就可以了。您的 activity 现在将监听您的事件。要触发事件,只需从您的自定义适配器调用 mListener.onClick()。您可以将需要的数据传回 ActivityFragment,然后您可以从那里直接访问 HeaderFooter,并且可以更改文本他们。