2010-01-04 164 views
15

我用ListView来动态添加项目,但是有一个关于不是Smooth添加的问题。 有TextView的和按钮,在我的listActivity,Iwant按下按钮,然后TextView的文本可以自动添加到ListView,但我按下按钮,它DONOT工作,除非以后我进入内容,按‘OK’键,再按下按钮,TextView's文字可以自动添加到ListView。我不知道为什么。如果我连续按下的按钮,为3次,然后按“确定”键,内容listView动态添加项目

自动添加列表

的看法,但3次。

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"); 
      } 
     } 
    }; 
    }} 

如何动态删除项目?

  • dynamic_list.xml只包含ListView控件,按钮,TextView的
  • row.xml包含TextView

回答

19

notifyDataSetChanged()方法用于更新适配器。

在这里,我发布了一个工作答案的步骤。

首先main.xml中文件:

<?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> 

这里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

什么是'R.layout.simle_list_item_1'? – 2012-11-08 16:23:37

+2

@AlanDeep这不是R.layout.simle_list_item_1,它的android.R.layout.simple_list_item_1,这个语句定义了列表的行布局,这里的simple_list_item_1是在android sdk中定义的布局的xml文件。 – 2012-11-09 10:30:59

+0

hw它可以在Base Adapter的情况下工作...任何想法? – CoDe 2013-08-28 14:13:25

2

是对ListActivityArrayAdapter类的你getBtnClickListener方法的一部分?

对我来说,当我从ListActivity类更新,我用这个代码...

// 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); 

当我从一个方法更新ArrayAdapter类中,我使用此代码...

// from a LongPress on a ListView item 
convertView.setOnLongClickListener(new OnLongClickListener(){ 
    @Override 
    public boolean onLongClick(View view) { 
     view.performHapticFeedback(0, View.HAPTIC_FEEDBACK_ENABLED); 
     // code to remove a Contact name from my database 
     // code to remove that Contact name from my list 
     // that is used by the ListView 
     ContactsAdapter.this.notifyDataSetChanged(); 
     return true; 
    }); 
+1

谢谢你的帮助,我的getBtnClickListener方法是ListActivity,其中只有一个按钮的一部分,但不属于列表显示。 我不明白你的代码。我的代码可以工作,但我想知道我必须按下“oK”按钮的原因,然后按下按钮,然后在textView中输入内容。我想我不需要按“确定”。 – pengwang 2010-01-05 05:10:12

0

是!,方法notifyDataSetChanged()在一个ArrayAdapter应用你缩绒他面前,对我来说是解决方案。从Firebase阅读。

对象

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);