【问题标题】:Using a Button from ArrayAdapter to an ListView使用从 ArrayAdapter 到 ListView 的按钮
【发布时间】:2014-07-13 05:15:41
【问题描述】:

我试图在不同的视图中使用按钮,但我得到了 NullPointerException,但现在,我尝试了这种方式,我摆脱了 NPE,但我仍然无法使按钮工作

layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = layoutInflater.inflate(R.layout.single_for_final, null, true);
        Button mView = (Button) v.findViewById(R.id.whyyounowork);
        mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT).show();
            }
        });

这是我的 ArrayAdapter

class ListForFinale extends ArrayAdapter<String> {
    private final Activity context;
    private final String[] imageId;
    private String[] web;

    public ListForFinale(Activity context,
                         String[] web, String[] imageId) {
        super(context, R.layout.list_single, web);
        this.context = context;
        this.web = web;
        this.imageId = imageId;
    }

    @Override
    public View getView(int position, View view, ViewGroup parent) {
        LayoutInflater inflater = context.getLayoutInflater();
        View rowView = inflater.inflate(R.layout.single_for_final, null, true);
        TextView txtTitle = (TextView) rowView.findViewById(R.id.txt1);
        Button button = (Button) rowView.findViewById(R.id.whyyounowork);
        TextView imageView = (TextView) rowView.findViewById(R.id.img1);
        txtTitle.setText(web[position]);
//        Double d = imageId[position];
//        String s= d.toString();
        imageView.setText(imageId[position]);
        return rowView;
    }
}

我正在尝试从表格布局的一行中获取文本字段和按钮并将其添加到列表视图中。文本字段工作完美,但按钮的 onClickListener 用于从列表视图中删除特定行,所以我能做到的唯一方法是使用 Activity 类中的按钮。但是,当在列表视图中单击时,该按钮不会执行任何操作。

我的java源文件是on GitHub for more details

【问题讨论】:

  • 您没有在 getView() 方法中设置任何 OnClickListener。
  • 什么类和方法包含第一个代码sn-p?
  • 我需要在我的活动中使用按钮的 onclicklistener 所以我在那里定义了它。
  • 那么你应该创建一个命名类而不是使用匿名类。
  • @Code-Apprentice myActivity2.java 包含第一个代码 sn-p。

标签: android listview button view layout-inflater


【解决方案1】:

虽然您似乎在两个地方使用了相同的布局文件,但这确实意味着您正在重用相同的View 实例。特别是,您的第一个 sn-p 中的 button 变量与您的 getView() 方法中的 button 变量是不同的对象。您为前者设置了OnClickListener,但没有为后者设置。

更新:

我有一个应用程序以某种类似的方式使用 ListView。我提前为自我推销道歉,但这是最好的例子。

我的应用是棒球卡库存系统,并在 ListView 中显示棒球卡。一个特点是用户可以从列表中选择卡片来删除它们。 (我删除卡片的确切机制与您尝试做的完全不同,但我认为我的一些设计决策将为您提供很好的示例。)

首先,我有一个 BaseballCard 类,其中包含棒球卡数据。这是一个简单的豆子。单个 BaseballCard 对象是根据从数据库中检索到的数据创建的。我强烈建议你做类似的事情。您应该有一个表示单个购物车项目的类和一个从该类创建的对象的 ArrayList。这将允许您比使用数组更轻松地动态添加和删除项目。

然后在getView() 方法中为每个按钮设置OnClickListener。您的侦听器将从数据库或 ArrayList 中删除数据,然后调用 notifyDataSetChanged() 以允许 ListView 重绘自身。 (对于我自己的适配器,您可以查看here。具体细节与您尝试做的不同,但请随意借鉴。)

【讨论】:

  • 所以我在 getView() 中设置了一个 onclicklistener,然后我该如何继续。
  • @user3832498 我仍然不清楚您要做什么。您想从列表视图中删除该行吗?如果是这样,请从您的模型中删除数据并在您的适配器上调用 notifyDataSetChanged()
  • 那个activity基本上就是一个购物车。所以他们不想拥有的物品会通过点击按钮被删除。这个按钮是我想要开始工作的。
  • @user3832498 如何表示购物车中的单个商品?
  • 我有一个表格布局,在最右边有一排有 2 个文本视图和一个按钮。我使用数组列表,然后将其转换为字符串数组,然后使用 listforfinale 的构造函数将数组添加到 listView 中的相应位置。我试过 notifyDataSetChange() 但是这个按钮的 onclicklistener 里面的任何东西都是没有意义的,因为它甚至没有执行它。
猜你喜欢
  • 2012-12-18
  • 2014-12-27
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
相关资源
最近更新 更多