RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 612052
Accepted
Вероника
Вероника
Asked:2020-01-08 04:56:09 +0000 UTC2020-01-08 04:56:09 +0000 UTC 2020-01-08 04:56:09 +0000 UTC

如何处理 Activity 中嵌套在 ListView 项目中的小部件的点击?

  • 772

ImageButton 在单独的适配器类中定义。我想从 MainActivity 引用它,以实现将项目从 Listview 添加到收藏夹。如何联系我?

这是适配器类

public class MyCursorAdapter extends CursorAdapter {

    private int layout; //нужен для создания объектов класса View

    public MyCursorAdapter(Context context, int layout, Cursor c, int flags) {
        super(context, c, flags);
        this.layout = layout;
    }

    public static class ViewHolder {
        public TextView txtBukva;
        public TextView txtSlovo;
        public ImageButton btnIzbrannoe;

        public void setBtnIzbrannoe(ImageButton btnIzbrannoe) {
            this.btnIzbrannoe = btnIzbrannoe;
        }
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(layout, parent, false);
        return view;
    }

    @Override
    public void bindView(View view, Context context, final Cursor cursor) {
        ViewHolder holder = new ViewHolder();
        String bukva = cursor.getString(cursor.getColumnIndex(Contract.Entry.COLUMN_SLOVO)).substring(0, 1).toUpperCase();
        String slovo = cursor.getString(cursor.getColumnIndex(Contract.Entry.COLUMN_SLOVO));
        String izbrannoe = cursor.getString(cursor.getColumnIndex(Contract.Entry.COLUMN_IZBRANNOE));

        holder.txtBukva = (TextView) view.findViewById(R.id.txtBukva);
        holder.txtSlovo = (TextView) view.findViewById(R.id.txtSlovo);
        holder.btnIzbrannoe = (ImageButton) view.findViewById(R.id.btnIzbrannoe);

        holder.txtBukva.setText(bukva);
        holder.txtSlovo.setText(slovo);
        holder.btnIzbrannoe.setFocusable(false);

        if (izbrannoe.equals("1")) {
            holder.btnIzbrannoe.setImageResource(R.drawable.icon_star_yellow);
        } else if (izbrannoe.equals("0")) {
            holder.btnIzbrannoe.setImageResource(R.drawable.icon_star_outline_black);
        }
    }

}
android
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. tse
    2020-01-08T05:23:44Z2020-01-08T05:23:44Z

    首先,您需要定义一个回调接口,适配器将通过该接口向 MainActivity 返回有关单击某个项目中的“收藏夹”按钮的信息。是这样的:

    public interface OnFavoriteListener {
        void onFavoriteClicked(Integer id);
    }
    

    第二个是向适配器添加一个方法,监听器对象将被传递到该方法。或者通过构造函数传递它。

    public class MyCursorAdapter extends CursorAdapter {
        OnFavoriteListener callback;
        ....
    
        public void setOnFavoriteListener(OnFavoriteListener callback) {
            this.callback = callback;
        }
    }
    

    第三。有必要将其唯一 id 绑定到每个显示的元素。我不明白 id 对你来说是什么:数据库中是否有带有 id 的列,还是来自 bukva 或 slovo 的一行。选择你自己。我会将它绑定到元素的根视图。因此,在 bindView 中你需要这样做:

    public void bindView(View view, Context context, final Cursor cursor {
        ....
    
        Integer id = .....;
        view.setTag(id);
    }
    

    第四。我们需要一个按钮单击处理程序,它将恢复 id 并使用 lisner 将其传递给 MainActivity:

    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        ....
        view.findViewById(R.id.btnIzbrannoe).setOnClickListener(new OnClickListener() {
            void onClick(View v) {
                if (callback != null) { 
                    Integer id = (Integer)v.getTag();
                    callback.onFavoriteClicked(id);
                }
            });
        return view;
    }
    

    第五,在 MainActivity 中,为您的按钮创建一个点击侦听器,将更改写入其中的数据库,然后重新加载适配器。

    我写的是“脑洞大开”,不检查,代码中可能有错别字,钻研本质。

    • 2
  2. Best Answer
    pavlofff
    2020-01-08T12:36:07Z2020-01-08T12:36:07Z

    如果列表在一个活动中(而不是一个片段),那么View处理对其中一个列表项的点击是非常容易的。在所需按钮的项目的 xml 标记中,指定属性onClick并指定处理单击的方法的名称(此处onFavoriteClick):

    <Button
        android:id="@+id/btnIzbrannoe"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onFavoriteClick"
        android:text="Favorite" />
    

    在显示列表的活动中,创建一个具有此名称和以下签名的方法:

    public void onFavoriteClick(View view) {
    
          // Действия при клике на кнопку btnIzbrannoe в айтеме
    
    }
    

    必要的附加数据可以在适配器中传递setTag()给此按钮,并View在回调返回的活动中接收。例如,要在适配器中传递光标位置:

    适配器:

    @Override
    public void bindView(View view, Context context, final Cursor cursor) {
        ViewHolder holder = new ViewHolder();
    
        holder.btnIzbrannoe = (ImageButton) view.findViewById(R.id.btnIzbrannoe);
        holder.btnIzbrannoe.setTag(cursor.getPosition());
    }
    

    活动:

    public void onFavoriteClick(View view) {
    
          Integer position = (Integer)view.getTag();
    
    }
    

    所以你可以传递任何对象,如果你需要多个数据,你可以使用集合或复合模型对象。

    不幸的是,在fragments中,这么简单的方法是行不通的,需要自己组织回调接口(callback)

    • 2
  3. Андрей Иванов
    2020-07-07T18:48:21Z2020-07-07T18:48:21Z

    通过单独创建的类列出输出。OnClickListener在为类对象添加输出之前:

            for (int i = 0; i < promoList.length(); ++i) {
                
                try {
                    checksObj = promoList.getJSONObject(i);
    
                    final PartFrameChecks partFrame = new PartFrameChecks(getApplicationContext());
                    partFrame.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            getCheckDetails(partFrame.getChecks_num(), partFrame.getChecks_date());
                        }
                    });
                    partFrame.setCheck_date(checksObj.getString("checks_date"));
                    partFrame.setSale_("Сумма покупки:", checksObj.getString("checks_mag"), checksObj.getString("checks_num"));
                    partFrame.setSale_sum(checksObj.getString("checks_summ") + " руб.");
                    partFrame.setChecks_num(checksObj.getString("checks_num"));
    
                    liner.addView(partFrame);
                } catch (JSONException e) {
                    Toast.makeText(this, "Ошибка разборки объекта массива \n" + ans, Toast.LENGTH_LONG).show();
                    e.printStackTrace();
                }
            }
    

    该类本身看起来大致像这样简化:

    public class PartFrameChecks extends RelativeLayout {
    
        private TextView check_date;
        private TextView sale_;
        private TextView sale_sum;
        private TextView sale_mag;
        private String checks_num;
    
        private View view;
        private Context contextLocalVar;
    
        public PartFrameChecks(Context context) {
            super(context);
            initComponents(context);
        }
    
        private void initComponents(Context context) {
    
            LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.custom_checks_layout, this);
            
            check_date  = view.findViewById(id.check_date);
            sale_       = view.findViewById(id.sale_text);
            sale_sum    = view.findViewById(id.sale_sum);
            sale_mag    = view.findViewById(id.sale_nom);
            checks_num  = "";
    
            contextLocalVar = context;
        };
    
        public void setCheck_date(String text) {
            if(check_date != null) check_date.setText(text);
            else Toast.makeText(contextLocalVar, "check_date is null. ", Toast.LENGTH_LONG).show();
        }
    
        public void setSale_(String text, String mag, String p_checks_num) {
            if((sale_ != null) && (sale_mag != null)) {
                checks_num = p_checks_num;
                sale_.setText(text);
                sale_mag.setText(mag + "\n" + checks_num);
    
            }
            else Toast.makeText(contextLocalVar, "sale_ is null. ", Toast.LENGTH_LONG).show();
        }
    
        public void setSale_sum(String text) {
            if(sale_sum!=null) sale_sum.setText(text);
            else Toast.makeText(contextLocalVar, "sale_sum is null. ", Toast.LENGTH_LONG).show();
        }
    
        public void setChecks_num(String text) {
            //checks_num = text;
        }
    
        public String getChecks_num() {
            return checks_num;
        }
    
        public String getChecks_date() {
            return check_date.getText().toString();
        }
    }
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5