2015-07-07 2 views
2

Это код, над которым я работаю, он должен просто добавлять элемент в ListView (w/array) каждый раз, когда нажимается кнопка. Текст, добавленный пользователем в EditText, должен быть добавлен в список при каждом нажатии кнопки.Как добавить элемент в ListView при каждом нажатии кнопки

Я считаю, что эта строка кода:

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" /> 

+2

В чем проблема? Это ошибка компиляции или ошибка времени выполнения? –

+0

можете ли вы сообщить об ошибке или объяснить, что происходит? –

+0

Это должно быть ошибка времени выполнения, но я думаю, что это что-то не так в моем коде, я думаю, проблема в том, что я пытаюсь передать значение 'namesText' в список, но это значение является типом TextView, поэтому оно не позволил бы мне вставить его на адаптер массива, поэтому я сделал подсказку, чтобы добавить это '(Список ) namesText', который (для меня) является реальной ошибкой @ Daniel Nugent – FET

ответ

1

Проблема заключается не в том, что вы используете прослушиватель кнопок, а в том, что вы не используете список в качестве источника данных вашего адаптера.

Я просто получил эту работу, используя 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(""); 

        } 
       } 
     ); 


    } 
+0

Да. Это то, что я имел в виду. Оно работает. Но не полностью: когда я добавляю в него часть, которую текстовая область должна быть очищена (но это не проблема для меня), нужно иметь возможность отображать более одного только элемента, если вы проверяете этот код (masteripiece;)) Я могу добавить только максимум 1 элемент, вместо этого каждый раз, когда я нажимаю кнопку ввода, он должен добавить еще один пункт. – FET

+0

Надеюсь, я объяснил концепцию этого достаточно хорошо @ Даниэль Нуджент;) – FET

+0

Спасибо, может быть, я ошибся при обновлении моей, Я буду ждать тебя;) – FET

0

Вы можете d о чем-то вроде этого:

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

И в файл XLM

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

Надеется, что это поможет.

+0

Попробуй, благодаря! – FET

+0

Ошибка: (21) Идентификатор ресурса не найден для атрибута 'onclick' в пакете 'android' – FET

+0

is 'android: onClick =" onMyButtonClick "' –

1

Для того, чтобы достичь желаемого, кажется, что нет смысла устанавливать адаптер внутри 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(); 
       } 

      } 
     } 
    ); 

}

+0

Да, это работает, но это не очищает текстовую область: P Кстати, да, это то, что я искал – FET

+0

@InssideYou попробуйте прямо сейчас! ;) Он также проверяет пустую строку. – GVillani82

+0

Да! Это работает, спасибо много @ Joseph82! Но теперь я пытаюсь понять, как добавить элемент сверху, а не снизу. – FET

0

Похоже 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); 
+0

Yeap! Это была ошибка, хороший Bugfinding job man;) – FET

Смежные вопросы