2010-01-04 24 views
15

मैंने डायनामिक ऐड आइटम में ListView का उपयोग किया, लेकिन चिकना जोड़ने के बारे में कोई समस्या नहीं है। मेरी सूची में टेक्स्टव्यू और बटन हैं। सक्रियता, प्रेस बटन दबाएं, फिर TextView का टेक्स्ट स्वचालित रूप से ListView पर जोड़ सकता है, लेकिन मैं बटन दबाता हूं, यह काम नहीं करता है, जब तक मैं सामग्री दर्ज नहीं करता, तब तक "ठीक" कुंजी दबाएं, फिर दबाए गए बटन दबाएं , 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"); 
      } 
     } 
    }; 
    }} 

आइटम को गतिशील कैसे हटाएं?

  • dynamic_list.xml केवल, ListView, बटन शामिल TextView
  • row.xml शामिल TextView

उत्तर

19

अधिसूचनाडेटासेट चेंज() विधि एडाप्टर को अद्यतन करने के लिए उपयोग की जाती है।

यहां मैं चरणबद्ध रूप से एक कार्यशील उत्तर चरण पोस्ट कर रहा हूं।

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' क्या है ?? –

+2

@AlanDeep यह R.layout.simle_list_item_1 नहीं है, इसकी android.R.layout.simple_list_item_1, यह कथन सूची के पंक्ति लेआउट को परिभाषित करता है, यहां simple_list_item_1 लेआउट की xml फ़ाइल है जो एंड्रॉइड एसडीके में परिभाषित है। –

+0

एचडब्ल्यू यह बेस एडाप्टर के मामले में काम कर सकता है ... कोई विचार? – CoDe

2

ListActivity या ArrayAdapter वर्ग के अपने 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 है, जो केवल एक बटन का हिस्सा है लेकिन संबंधित नहीं सूची दृश्य। मैं आपका कोड समझ नहीं पा रहा हूं। मेरा कोड काम कर सकता है, लेकिन मैं टेक्स्ट को देखने के बाद "ओके" प्रेस दबाए जाने के कारण को जानना चाहता हूं, फिर बटन दबाएं। मुझे लगता है कि मुझे "ठीक" प्रेस की आवश्यकता नहीं है। – pengwang

1

मैं और पृष्ठभूमि में मेरी सूची में और अधिक डेटा जोड़ने के लिए एक धागा का उपयोग तो notifydatasetchange , यह सफलतापूर्वक काम करता है

यहां पूरा कोड है: http://code.google.com/p/dynamic-listview/source/checkout

0

हां !!, विधि को सूचित करने के लिए आपको पता लगाने से पहले ArrayAdapter में लागू DataSetChanged(), मेरे लिए समाधान था। फायरबेस से पढ़ना

ऑब्जेक्ट्स

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); 
संबंधित मुद्दे