如何在android的ListView中为按钮添加OnClick()?

Posted

技术标签:

【中文标题】如何在android的ListView中为按钮添加OnClick()?【英文标题】:How to add OnClick() for buttons in ListView of android? 【发布时间】:2015-06-18 17:47:59 【问题描述】:

这是我的应用程序。单击新按钮时,它将一一显示问题,如果我们单击选项(A、B、C、D),我应该显示正确或不正确。对于我现在建议的编码问题我的选项。

我在一个 xml 文件中有 5 个文本视图和 4 个按钮,这些数据是从数据库中填充的,所以我使用了 ListView 和 SimpleCursorAdapter。一切正常。现在我想为 Xml 文件中的按钮编写 OnClick 函数。我无法添加 SetOnClickListener,因为它显示错误“无法对资源 ID 进行优化”,因为按钮在不同的 xml 中可用。 如何为这些按钮分配 OnClick()?

SQLiteDatabase db;
Cursor c1;
Button b1;
String from[] = "_id", "optn1", "optn2", "optn3", "optn4", "ab";
int[] to = R.id.textView3, R.id.textView5, R.id.textView6, R.id.textView7, R.id.textView8, R.id.textView10;
int i = 0;

protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    db.execSQL("CREATE TABLE ques(_id TEXT,optn1 TEXT ,optn2 TEXT,optn3 TEXT,optn4 TEXT,qno INTEGER,ab INTEGER)");
    t1 = (TextView) findViewById(R.id.textView4);
    t2 = (TextView) findViewById(R.id.textView9);
    b1 = (Button) findViewById(R.id.button);
    b1.setOnClickListener(this);


public void onClick(View v) //this onclick is to display the texts only if the button is clicked not as soon as the app is executed
    if (v == b1) 
        db = openOrCreateDatabase("quiz1.db", SQLiteDatabase.CREATE_IF_NECESSARY, null);
        if (c1 != null) 
            i = c1.getInt(c1.getColumnIndex("qno"));
        
        c1 = db.rawQuery("SELECT * FROM ques WHERE qno>'" + i + "' ORDER BY qno LIMIT 1", null);
        SimpleCursorAdapter sca = new SimpleCursorAdapter(MainActivity.this, R.layout.compo_list, c1, from, to);
        ListView l1 = (ListView) findViewById(R.id.listView);
        l1.setAdapter(sca);
        sca.changeCursor(c1);
        t1.setText(String.valueOf(i));
    

  Layout.XML
    <TextView
        android:layout_
        android:layout_
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:id="@+id/textView3"
        android:text="QUESTION"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="44dp" />

    <TextView
        android:layout_
        android:layout_
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/textView5"
        android:layout_marginTop="46dp"
        android:phoneNumber="false"
        android:gravity="center"
        android:layout_below="@+id/textView3"
        android:layout_centerHorizontal="true" />

    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_
        android:layout_
        android:text="A"
        android:id="@+id/button2"
        android:layout_alignTop="@+id/textView5"
        android:layout_toLeftOf="@+id/textView5"
        android:layout_toStartOf="@+id/textView5" />

    <TextView
        android:layout_
        android:layout_
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/textView6"
        android:layout_below="@+id/button2"
        android:layout_toRightOf="@+id/button2"
        android:layout_toEndOf="@+id/button2"
        android:gravity="center" />

    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_
        android:layout_
        android:text="B"
        android:id="@+id/button3"
        android:layout_below="@+id/button2"
        android:layout_alignLeft="@+id/button2"
        android:layout_alignStart="@+id/button2"
        android:layout_alignRight="@+id/button2"
        android:layout_alignEnd="@+id/button2"/>

    <TextView
        android:layout_
        android:layout_
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/textView7"
        android:layout_below="@+id/button3"
        android:layout_alignLeft="@+id/textView6"
        android:layout_alignStart="@+id/textView6"
        android:gravity="center" />

    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_
        android:layout_
        android:text="C"
        android:id="@+id/button4"
        android:layout_alignTop="@+id/textView7"
        android:layout_alignLeft="@+id/button3"
        android:layout_alignStart="@+id/button3" />

    <TextView
        android:layout_
        android:layout_
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/textView8"
        android:layout_below="@+id/button4"
        android:layout_toRightOf="@+id/button4"
        android:layout_toEndOf="@+id/button4"
        android:gravity="center" />

    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_
        android:layout_
        android:text="D"
        android:id="@+id/button5"
        android:layout_alignTop="@+id/textView8"
        android:layout_alignLeft="@+id/button4"
        android:layout_alignStart="@+id/button4" />

等待建议。如果您能帮助我,将不胜感激。在此先感谢。

【问题讨论】:

很抱歉,您使用setOnClick 的部分在哪里?我只能看到查询数据库并将适配器设置为 listView 实际上按钮在“R.layout.compo_list” XML 文件中。它是传递给 ListView 的组件。 请使用当前信息更新您的问题。您能否提供您刚才提到的这种布局的缺失部分? 列出的错误是“”Couldnt Fine the resource id”。那是哪个代码?是在“new SimpleCursorAdapter” No.here is my LogCatjava.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference at com.example.shark.lvquiz.MainActivity.onCreate(MainActivity.java:38)当我尝试b2 = (Button) findViewById(R.id.button2); b2.setOnClickListener(this);below button 1时显示 【参考方案1】:

从您的列表视图中执行。

    l1.setOnItemClickListener(new OnItemClickListener()

    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1,int position, long arg3)
     
        Toast.makeText(getActivity(), "" + position, Toast.LENGTH_SHORT).show();
    
);

【讨论】:

为什么不让 ListView 的子项对其进行迭代,如果它是 Button 的实例,则将其转换为一个按钮并在该按钮上调用 setOnClickListener。一会儿我给你举个例子 @Sharathkumar - 在您设置适配器后的任何地方,Michael P 还帮助您找到完整的解决方案,正如我所发布的那样,点击任何项目的工作,包括您的文本视图,更多的是指向您在如何使用列表视图中的 onclick 的方向上 我不知道怎么做 michael 说的。谁能解释或建议一些链接? 我不相信.. 怎么可能发布这么低质量的答案而不检查它是否有效...... @dave 你检查过这个吗? OP 需要帮助在 listview 子项中的按钮上设置单击侦听器。当然,如果你只是在listView的项目中找到视图,它是行不通的。您还必须在项目布局的根目录中使用 android:descendantFocusability="blocksDescendants" @deadfish,我不是在为其他人编码,我喜欢给他们一个起点,这样他们就可以自己学习,这是处理 onclick 监听器的普遍接受的方式列表视图【参考方案2】:

关于代码:

SimpleCursorAdapter sca = new SimpleCursorAdapter(MainActivity.this, R.layout.compo_list, c1, from, to);
ListView l1 = (ListView) findViewById(R.id.listView);

当您使用布局 xml compo_list 调用 SimpleCursorAdapter 时,它不会扩展布局。它适用于 Adapter不是 Activity。因此,您应该在 findViewById(R.id.listView) 上收到运行时错误

建议:

在 SimpleCursorAdapter 中,复制适配器的 findViewById 代码。这是一种常见的技术。 不要尝试在活动中充气,setContentView 已经这样做了。这很令人困惑,而且需要做很多工作。通常充气是在一个片段中完成的。在 Fragment 中,您可以调用并创建 SimpleCursorAdapter 的新实例。 活动中已有代码setContentView(R.layout.activity_main)。这通常是您可以放置​​ UI 元素的唯一布局文件。

编辑: 根据您的建议,以下是关于 ListView 的优秀网页教程:

    ArrayAdapter @Using an ArrayAdapter with ListView SimpleCursorAdapter 与 ListView Using CursorAdapters

注意事项

网页 1 介绍了将 ListView 与流行的 AArrayAdapter 结合使用。 第 2 页介绍了使用 CursorAdapters,假设您知道如何使用 ListView 和基本适配器。

链接页面 1 中的代码 sn-p:

public View getView(int position, View convertView, ViewGroup parent) 
       // Get the data item for this position
       User user = getItem(position);    
       // Check if an existing view is being reused, otherwise inflate the view
       if (convertView == null) 

          convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_user, parent, false);
       

注意代码 sn-p 中的 inflate 方法。这是您要用于R.layout.compo_list 的布局。

我希望这有助于并解释您的问题。看来你还有一些工作要做。祝你好运,玩得开心......

【讨论】:

你是说用片段做而不是用 XML 膨胀? @Sharathkumar,创建一个片段并在其中膨胀布局 xml,而不是主要活动。为了澄清,我在关于建议的帖子中做了一些编辑。有关于适配器和列表视图主题的很好的示例/教程。 你能告诉我PM联系你的方法吗?如果你同意的话。 @Sharathkumar,我在编辑部分添加了一些注释和解释。我知道要读的东西很多。我建议在您修复您发布的运行时错误后,如果您对 Adapter/ListView 或 CursorAdapter 有问题,请再发布一个。再次希望我的帖子有所帮助。如果您认为是这样,您可以点击“有用”图标。 @Sharathkumar,在继续您的下一个问题或帖子之前,原始问题是否已解决?您似乎忘记了这个发布的答案。否则告诉我答案是否有帮助。【参考方案3】:

放置了一个名为 ListViewAdapter 的新活动,它扩展了 BaseAdapter 并覆盖了其中的功能。将所有 OnClick() 活动放在这个类中,它工作得很好。 如果有人需要更多信息,请联系我。

【讨论】:

【参考方案4】:
  listview.setOnItemClickListener(new AdapterView.OnItemClickListener() 

  @Override
  public void onItemClick(AdapterView<?> parent, final View view,
      int position, long id) 
    final String item = (String) parent.getItemAtPosition(position);
    t1.setText(String.valueOf(item));

  

);

【讨论】:

如果位置数不等于listView的孩子数,它将不起作用 我的问题很简单@Deadfish...我在 myAdap 类中有 onClick(),它应该在单击按钮时打印增量值。请建议一些方法吗?谢谢!

以上是关于如何在android的ListView中为按钮添加OnClick()?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 的 LISTVIEW 中为每个原​​始图像添加不同的图像?

如何在Android ListView中为菜单项创建图标?

我在 android 版本 4.3 中为 listview 跨应用程序使用 listview 添加/删除页脚?

如何在android中为按钮添加图像?

如何在android中为按钮添加边框[重复]

如何在安卓中为按钮添加颜色