Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android listView动态添加项_Android_Listview - Fatal编程技术网

Android listView动态添加项

Android listView动态添加项,android,listview,Android,Listview,我使用了ListView来动态添加项目,但存在一个添加不顺畅的问题。 我的listActivity中有textView和按钮,我想按一下按钮,然后textView的文本可以自动添加到ListView,但我按了按钮,它不工作,除非我输入内容后,按“OK”键,然后按一下按钮,textView的文本可以自动添加到ListView。我不知道为什么。如果我连续按了3次按钮,然后按“Ok”键,内容就会消失 自动添加列表 只看3次 public class DynamicListItems extends

我使用了
ListView
来动态添加项目,但存在一个添加不顺畅的问题。 我的listActivity中有textView和按钮,我想按一下按钮,然后
textView
的文本可以自动添加到
ListView
,但我按了按钮,它不工作,除非我输入内容后,按“OK”键,然后按一下按钮,
textView的
文本可以自动添加到
ListView
。我不知道为什么。如果我连续按了3次按钮,然后按“Ok”键,内容就会消失

自动添加列表

只看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");
            }
        }
    };
   }}
公共类DynamicListItems扩展了ListActivity{
私有静态最终字符串项\u KEY=“KEY”;
ArrayList=新建ArrayList();
专用SimpleAdapter适配器;
私有EditText newValue;@Override
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.dynamic_列表);
newValue=(EditText)findViewById(R.id.new\u value\u字段);
setListAdapter(新SimpleAdapter(this,list,R.layout.row,新字符串[]{ITEM_KEY},新int[]{R.id.list_value}));
((ImageButton)findViewById(R.id.button)).setOnClickListener(getbtnclicklListener());
}
私有OnClickListener getbtnclicklListener(){
返回新的OnClickListener(){
公共void onClick(视图){
试一试{
HashMap项=新建HashMap();
item.put(item_键,newValue.getText().toString());
列表。添加(项目);
adapter.notifyDataSetChanged();
}捕获(NullPointerException e){
Log.i(“[动态项]”,“试图添加空值”);
}
}
};
}}
如何动态删除项目

  • dynamic_list.xml仅包含listView、button和textView
  • row.xml包含
    TextView

您的
getBtnClickListener
方法是
ListActivity
ArrayAdapter
类的一部分吗

对我来说,当我从
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);
 // 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;
     });
当我从
ArrayAdapter
类中的方法进行更新时,我使用以下代码

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

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;
        }
    }
}
import java.util.ArrayList;
导入android.app.Activity;
导入android.os.Bundle;
导入android.view.KeyEvent;
导入android.view.view;
导入android.widget.ArrayAdapter;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.ListView;
公共类MainActivity扩展了活动{
私人编辑文本输入;
专用按钮btnAdd;
私有ListView项目;
私人ArrayList itemArrey;
专用ArrayAdapter项适配器;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.dyanamic_列表);
setUpView();
}
私有void setUpView(){
etInput=(EditText)this.findViewById(R.id.EditText\u输入);
btnAdd=(Button)this.findviewbyd(R.id.Button\u add);
lvItem=(ListView)this.findViewById(R.id.ListView\u items);
ItemArray=新的ArrayList();
itemArrey.clear();
itemAdapter=newArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,itemArray);
lvItem.setAdapter(itemAdapter);
btnAdd.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
addItemList();
}
});
etInput.setOnKeyListener(新视图.OnKeyListener(){
公共布尔onKey(视图v、int keyCode、KeyEvent事件){
if(keyCode==KeyEvent.keyCode\u输入){
addItemList();
}
返回true;
}
});
}
受保护的void addItemList(){
如果(isInputValid(etInput)){
add(0,etInput.getText().toString());
setText(“”);
itemAdapter.notifyDataSetChanged();
}   
}
受保护的布尔值isInputValid(EditText etInput2){

如果(etInput2.getText().toString().trim().length()我在后台使用线程将更多数据添加到列表中,然后使用
notifydatasetchange
,它将成功工作


以下是完整的代码:

Yes!!,在填充ArrayAdapter之前,在ArrayAdapter中应用的notifyDataSetChanged()方法是我的解决方案。阅读Firebase

物体

    private DatabaseReference myRef;
    ArrayList<String> lista;
    ArrayAdapter<String> adapter;
私有数据库参考myRef;
ArrayList lista;
阵列适配器;
一次创建

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

    //GETTIN MY DATA TO SHOW IN CHAT
    lista = new ArrayList<String>();
FirebaseDatabase=FirebaseDatabase.getInstance();
myRef=database.getReference(“chat”);
//获取要在聊天中显示的数据
lista=新的ArrayList();
恢复

    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);
myRef.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
对于(DataSnapshot postSnappy:DataSnapshot.getChildren()){
对于(DataSnapshot rePostSnappy:postSnappy.getChildren()){
//要在ListView中显示的已定义数组值
add(新字符串(rePostSnappy.getValue().toString());
adapter.notifyDataSetChanged();//通知将要更改的适配器
}
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
适配器=新阵列适配器(此,
android.R.layout.simple_list_item_1,lista);
ListView listVista=(ListView)findViewById(R.id.list);
setAdapter(适配器);
谢谢