【问题标题】:How to add an item to a ListView with each Button click如何在每次单击按钮时将项目添加到 ListView
【发布时间】:2015-09-25 13:40:09
【问题描述】:

这是我正在处理的代码,它应该在每次单击按钮时简单地在 ListView(带数组)中添加一个项目。每次单击 Button 时,用户在 EditText 上插入的文本都应添加到列表中。

我发现这行代码:

new Button.OnClickListener()

被视为“匿名”的东西,它没有运行,请帮帮我;(

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.*;
import android.widget.*;
import java.lang.*;
import java.util.List;

public class MainActivity extends ActionBarActivity {
//Setup Lists
String[] arrayNames;
ListView listNames;
TextView namesText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //Creating and Printing Lists
    listNames = (ListView) findViewById(R.id.listNamesId);
    namesText = (TextView) findViewById(R.id.namesTexter);
    final ArrayAdapter<String> adapterNames = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, android.R.id.text1, (List<String>) namesText);

    Button buttonPlus = (Button)findViewById(R.id.buttonPlus);
    buttonPlus.setOnClickListener(
            new Button.OnClickListener() {
                public void onClick(View v) {
                    listNames.setAdapter(adapterNames);
                }
            }
    );
}

XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">


<ListView
    android:id="@+id/listNamesId"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:divider="#000"
    android:dividerHeight="1dp"
    android:headerDividersEnabled="true"
    android:layout_marginTop="50dp"></ListView>

<Button
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/textnametextname"
    android:id="@+id/buttonPlus"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:nestedScrollingEnabled="false" />

<EditText
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:id="@+id/namesTexter"
    android:layout_alignBottom="@+id/buttonPlus"
    android:layout_centerHorizontal="true"
    android:inputType="text" />

【问题讨论】:

  • 到底是什么问题?这是编译错误还是运行时错误?
  • 你能提供错误,或者解释发生了什么吗?
  • 这应该是一个运行时错误,但我认为这只是我的代码有问题,我想问题是我试图将namesText 的值传递到一个列表中,但是那个值是一个 TextView 类型,所以它不允许我将它插入到数组适配器上,这就是为什么我确实提示添加 (List&lt;String&gt;) namesText 这是(对我来说)真正的错误@Daniel Nugent
  • 就是@JasonPortnoy,我认为错误是找到一种方法在该适配器中传递namesText的值
  • 你说它没有被调用?你能显示你的activity_main xml

标签: java android android-listview android-button


【解决方案1】:

问题不在于您的按钮单击侦听器,而在于您没有使用 List 作为适配器的数据源。

我刚刚使用 ArrayList 作为数据源,并在按钮单击侦听器中更新它。每次单击按钮时,EditText 中的任何内容都会添加到 ListView。

public class MainActivity extends ActionBarActivity {

    ArrayList<String> arrayNames = new ArrayList<String>();
    ListView listNames;
    TextView namesText;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        //Creating and Printing Lists
        listNames = (ListView) findViewById(R.id.listNamesId);
        namesText = (TextView) findViewById(R.id.namesTexter);
        final ArrayAdapter<String> adapterNames = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, android.R.id.text1, arrayNames);
        listNames.setAdapter(adapterNames);

        Button buttonPlus = (Button)findViewById(R.id.buttonPlus);

        buttonPlus.setOnClickListener(
                new Button.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        arrayNames.add(0, namesText.getText().toString());
                        adapterNames.notifyDataSetChanged();
                        namesText.setText("");

                    }
                }
        );


    }

【讨论】:

  • 是的。这就是我的意思。有用。但不完全是:当我添加一个应该清除文本区域的部分时(但这对我来说不是问题),如果您测试此代码(杰作;)),它需要能够仅显示超过 1 个项目我最多只能添加 1 项,而是每次单击输入时都应添加一项
  • 希望我已经很好地解释了它的概念@Daniel Nugent ;)
  • 谢谢,可能是我更新错了,我等你;)
  • 你太棒了@Daniel Nugent ;) 但是,还有一个问题是不要让你这么早离开......如何告诉应用程序将项目添加到顶部而不是底部?
  • @InssideYou 刚刚又更新了答案,就用arrayNames.add(0, namesText.getText().toString());。这会将每个项目添加到列表的开头而不是添加到末尾!
【解决方案2】:

看起来 namesText 是一个 TextView。但它在下一行被转换为列表。

namesText = (TextView) findViewById(R.id.namesTexter);


final ArrayAdapter<String> adapterNames = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, android.R.id.text1, (List<String>) namesText); 

【讨论】:

    【解决方案3】:

    为了实现你想要的,在 onclick 中设置适配器似乎毫无意义。您应该在onClick()方法中添加一个项目,然后在适配器上调用notifyDataSetChanged()方法,以确保显示新数据。

    这是代码:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        final ListView listNames = (ListView) findViewById(R.id.listNamesId);
        final TextView namesText = (TextView) findViewById(R.id.namesTexter);
        final ArrayAdapter<String> adapterNames = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>());
        listNames.setAdapter(adapterNames);
    
        Button buttonPlus = (Button)findViewById(R.id.buttonPlus);
        buttonPlus.setOnClickListener(
            new Button.OnClickListener() {
                public void onClick(View v) {
                    if(!namesText.getText().toString().isEmpty()){
                         adapterNames.add(namesText.getText().toString());
                         namesText.setText("");
                         adapterNames.notifyDataSetChanged();
                    }
    
                }
            }
        );
    

    }

    【讨论】:

    • 是的,它可以工作,但它不能清除文本区域:P 顺便说一句,绝对是的,这就是我要找的
    • @Insside你现在试试! ;) 它还检查空字符串。
    • 是的!它有效,非常感谢@Joseph82!但现在我想弄清楚如何在顶部而不是底部添加项目..
    • 在您的 xml 中添加 android:stackFromBottom="true" 到您的 ListView
    • 再次感谢!你是 JavaRock ! ;)
    【解决方案4】:

    你可以这样做:

    public void onMyButtonClick(View view){
            listNames.setAdapter(adapterNames);    
    }
    

    在你的 xlm 文件中

    <Button>
     .....
    android:onclick="onMyButtonClick"
    ....
    

    希望这会对你有所帮助。

    【讨论】:

    • 错误:(21) 在包 'android' 中找不到属性 'onclick' 的资源标识符
    • android:onClick="onMyButtonClick"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多