【问题标题】:listView dynamic add itemlistView 动态添加项
【发布时间】:2010-01-04 09:43:38
【问题描述】:

我使用ListView动态添加item,但是有一个问题是不能平滑添加。 我的listActivity中有textView和button,我想按下按钮,然后TextView的文字可以自动添加到ListView,但是我按下了按钮,它不起作用,除非我输入内容后,按下“OK”键,然后按下按钮,TextView's 文本可以自动添加到ListView。我不知道为什么。如果我连续按下按钮,如3次,然后按“确定”键,内容

自动添加列表

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

如何动态删除item?

  • dynamic_list.xml 只包含 listView ,button,textView
  • row.xml 包含TextView

【问题讨论】:

    标签: android listview


    【解决方案1】:

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

    在这里,我将逐步发布有效的答案。

    ma​​in.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;
            }
        }
    }
    

    【讨论】:

    • R.layout.simle_list_item_1 是什么??
    • @AlanDeep 这不是 R.layout.simle_list_item_1,它的 android.R.layout.simple_list_item_1 ,这个语句定义了列表的行布局,这里 simple_list_item_1 是布局的xml文件,定义在安卓 SDK。
    【解决方案2】:

    您的getBtnClickListener 方法是ListActivityArrayAdapter 类的一部分吗?

    对我来说,当我从 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;
         });
    

    【讨论】:

    • 感谢您的帮助,我的 getBtnClickListener 方法是 ListActivity 的一部分,它只是一个按钮,但不属于 listView。我不明白你的代码。我的代码可以工作,但我想知道为什么我必须按“ok”按,然后按按钮,在我在 textView 中输入内容后。我想我不需要按“确定”。
    【解决方案3】:

    我使用线程在后台将更多数据添加到我的列表中,然后notifydatasetchange,它成功运行

    这里是完整的代码:http://code.google.com/p/dynamic-listview/source/checkout

    【讨论】:

      【解决方案4】:

      是的!!,在你填满他之前,在 ArrayAdapter 中应用的方法 notifyDataSetChanged() 是我的解决方案。从 Firebase 读取。

      对象

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

      创建时

          FirebaseDatabase database = FirebaseDatabase.getInstance();
          myRef = database.getReference("chat");
      
          //GETTIN MY DATA TO SHOW IN CHAT
          lista = new ArrayList<String>();
      

      关于恢复

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-27
        • 2016-05-13
        • 2017-11-14
        • 2014-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-17
        相关资源
        最近更新 更多