アイテムを動的に追加するためにListView
を使用しましたが、スムーズに追加できないという問題があります。私のlistActivityにtextViewとボタンがあり、ボタンを押す必要があります。その後、TextView
のテキストはListView
に自動追加できますが、コンテンツを入力した後でなければ、ボタンを押しても機能しません。 OK」キーを押してから、ボタンを押します、TextView's
テキストは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");
}
}
};
}}
アイテムを動的に削除する方法は?
TextView
が含まれていますnotifyDataSetChanged()メソッドを使用してアダプターを更新します。
ここでは、ステップごとに有効な回答を投稿しています。
最初のmain.xml file:
<?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;
}
}
}
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);
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;
});
スレッドを使用して、バックグラウンドでリストにデータを追加し、次にnotifydatasetchange
を使用して、正常に動作します
ここに完全なコードがあります: http://code.google.com/p/dynamic-listview/source/checkout
はい!!、彼をいっぱいにする前にArrayAdapterに適用されたメソッドnotifyDataSetChanged()が私にとっての解決策でした。 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);