2010-01-04 24 views
15

Ich habe ListView verwendet, um Artikel dynamisch hinzuzufügen, aber es gibt ein Problem über nicht Smooth add. gibt es textView und Knopf in meiner listActivity, Iwant zum Drücken der Taste, dann TextView 's Text kann automatisch zu ListView hinzufügen, aber ich drückte Taste, es donot Arbeit, es sei denn, nachdem ich Inhalte eingeben, drücken Sie auf "OK" -Taste, dann Taste gedrückt , TextView's Text kann automatisch zu ListView hinzugefügt werden. Keine Ahnung warum. Wenn ich kontinuierlich gedrückte Taste, wie 3-mal, und drücken Sie „OK“ -Taste, um den InhaltlistView dynamic Artikel hinzufügen

Auto Liste

Ansicht aber 3 mal hinzufügen.

public class DynamicListItems extends ListActivity { 
    private static final String ITEM_KEY = "key"; 
    ArrayList<HashMap<String, String>> list= new ArrayList<HashMap<String, String>>(); 
private SimpleAdapter adapter; 
private EditText newValue;@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.dynamic_list); 
    newValue = (EditText) findViewById(R.id.new_value_field); 

    setListAdapter(new SimpleAdapter(this, list, R.layout.row, new String[] { ITEM_KEY }, new int[] { R.id.list_value })); 
    ((ImageButton) findViewById(R.id.button)).setOnClickListener(getBtnClickListener()); 
} 

private OnClickListener getBtnClickListener() { 
    return new OnClickListener() { 
     public void onClick(View view) { 
      try { 

       HashMap<String, String> item = new HashMap<String, String>(); 
       item.put(ITEM_KEY, newValue.getText().toString()); 
       list.add(item); 

       adapter.notifyDataSetChanged(); 
      } catch (NullPointerException e) { 
       Log.i("[Dynamic Items]", "Tried to add null value"); 
      } 
     } 
    }; 
    }} 

Wie man das Einzelteil dynamisch löscht?

  • dynamic_list.xml enthält nur Listview, Button, Textview
  • row.xml enthält TextView

Antwort

19

notifyDataSetChanged() Methode wird verwendet, um den Adapter zu aktualisieren.

Hier posten ich eine funktionierende Antwort Schritt für Schritt.

Zunächst main.xml Datei:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:id="@+id/input"> 

     <EditText 
      android:id="@+id/editText_input" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:ems="10" > 

      <requestFocus /> 
     </EditText> 

     <Button 
      android:id="@+id/button_add" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="0" 
      android:text="Add" /> 
    </LinearLayout> 


    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_above="@+id/input" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:orientation="vertical" > 

     <ListView 
      android:id="@+id/listView_items" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" > 
     </ListView> 

    </LinearLayout> 

</RelativeLayout> 

Hier MainActivity.java:

import java.util.ArrayList; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 

public class MainActivity extends Activity { 
    private EditText etInput; 
    private Button btnAdd; 
    private ListView lvItem; 
    private ArrayList<String> itemArrey; 
    private ArrayAdapter<String> itemAdapter; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.dyanamic_list); 
     setUpView(); 

    } 

    private void setUpView() { 
     etInput = (EditText)this.findViewById(R.id.editText_input); 
     btnAdd = (Button)this.findViewById(R.id.button_add); 
     lvItem = (ListView)this.findViewById(R.id.listView_items); 

     itemArrey = new ArrayList<String>(); 
     itemArrey.clear(); 

     itemAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,itemArrey); 
     lvItem.setAdapter(itemAdapter); 

     btnAdd.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       addItemList(); 
      } 
     }); 

     etInput.setOnKeyListener(new View.OnKeyListener() { 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 
       if (keyCode == KeyEvent.KEYCODE_ENTER) { 
        addItemList(); 
       } 
       return true; 
      } 
     }); 
    } 

    protected void addItemList() { 
     if (isInputValid(etInput)) { 
      itemArrey.add(0,etInput.getText().toString()); 
      etInput.setText(""); 
      itemAdapter.notifyDataSetChanged(); 
     } 
    } 

    protected boolean isInputValid(EditText etInput2) { 
     if (etInput2.getText().toString().trim().length()<1) { 
      etInput2.setError("Please Enter Item"); 
      return false; 
     } else { 
      return true; 
     } 
    } 
} 
+1

Was ist 'R.layout.simle_list_item_1' ?? –

+2

@AlanDeep dies ist nicht R.layout.simle_list_item_1, Seine android.R.layout.simple_list_item_1, diese Anweisung definiert das Zeilenlayout der Liste, Hier simple_list_item_1 ist die XML-Datei des Layouts, die im Android SDK definiert sind. –

+0

hw kann es bei Base Adapter funktionieren ... keine Ahnung? – CoDe

2

Ist Ihr getBtnClickListener Methode Teil des ListActivity oder ArrayAdapter Klasse?

für mich, wenn ich von der ListActivity Klasse aktualisieren, verwende ich diesen Code ...

// code to add a Contact to my database 
// code to add a Contact to the list that 
// that is used by the ListView 
setListAdapter(adapter); 
getListView().setTextFilterEnabled(true); 

Wenn ich von einer Methode innerhalb der Klasse ArrayAdapter bin zu aktualisieren, verwende ich diesen Code ...

+1

Danke für Ihre Hilfe, meine getBtnClickListener Methode ist Teil der ListActivity, die nur eine Taste, aber gehört nicht zu Listenansicht. Ich verstehe Ihren Code nicht. Mein Code kann funktionieren, aber ich möchte den Grund dafür festlegen, dass ich auf "OK" drücken muss. Drücken Sie, und drücken Sie die Taste, nachdem ich den Inhalt in der Textansicht eingegeben habe. Ich denke, ich brauche nicht "OK" drücken. – pengwang

0

Ja !!, die Methode notifyDataSetChanged() im ArrayAdapter angewendet, bevor Sie ihn füllten, war die Lösung für mich. Lesen von Firebase.

Objekte

private DatabaseReference myRef; 
    ArrayList<String> lista; 
    ArrayAdapter<String> adapter; 

OnCreate

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    myRef = database.getReference("chat"); 

    //GETTIN MY DATA TO SHOW IN CHAT 
    lista = new ArrayList<String>(); 

onResume

myRef.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot postSnappy : dataSnapshot.getChildren()){ 
       for (DataSnapshot rePostSnappy : postSnappy.getChildren()){ 
        // Defined Array values to show in ListView 
        lista.add(new String(rePostSnappy.getValue().toString())); 
        adapter.notifyDataSetChanged();//Notyfing adapter that will goes to change 
       } 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

    adapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, lista); 

    ListView listVista = (ListView) findViewById(R.id.list); 
    listVista.setAdapter(adapter);