एंड्रॉइड में गतिशील रूप से सूची में तत्वों को कैसे जोड़ा जाए


326

क्या कोई समझा सकता है या Android में एक सूची दृश्य बनाने के लिए एक ट्यूटोरियल का सुझाव दे सकता है?

यहाँ मेरी आवश्यकताएं हैं:

  • मुझे एक बटन दबाकर नए तत्वों को गतिशील रूप से जोड़ने में सक्षम होना चाहिए।
  • समझने के लिए पर्याप्त सरल होना चाहिए (संभवतः किसी भी प्रदर्शन में सुधार या कन्वर्टव्यू के बिना, उदाहरण के लिए)

मुझे पता है कि इस विषय पर काफी कुछ सवाल हैं, यहां StackOverflow पर पोस्ट किया गया है, लेकिन ऐसा कोई भी नहीं मिला जो मेरे सवाल का जवाब दे सके। धन्यवाद!


3
शार्दुल से वर्तमान में सबसे अधिक मतदान का जवाब उच्च गुणवत्ता माना जाता है और उपयोगकर्ताओं ने व्यक्त किया है कि उन्हें लगता है कि इसे स्वीकार किया जाना चाहिए। क्या आप इसे स्वीकार करने पर विचार कर सकते हैं?
मैट वेल्के

जवाबों:


583

अपनी परियोजना के res/layout/main.xmlफ़ोल्डर में पहले XML लेआउट बनाएँ :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <Button
        android:id="@+id/addBtn"
        android:text="Add New Item"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="addItems"/>
    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:drawSelectorOnTop="false"
    />
</LinearLayout>

यह शीर्ष पर एक बटन और तल पर एक सूची दृश्य के साथ एक सरल लेआउट है। ध्यान दें कि ListViewआईडी है @android:id/listजो डिफ़ॉल्ट रूप में परिभाषित करता है ListViewएक ListActivityउपयोग कर सकते हैं।

public class ListViewDemo extends ListActivity {
    //LIST OF ARRAY STRINGS WHICH WILL SERVE AS LIST ITEMS
    ArrayList<String> listItems=new ArrayList<String>();

    //DEFINING A STRING ADAPTER WHICH WILL HANDLE THE DATA OF THE LISTVIEW
    ArrayAdapter<String> adapter;

    //RECORDING HOW MANY TIMES THE BUTTON HAS BEEN CLICKED
    int clickCounter=0;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        adapter=new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1,
            listItems);
        setListAdapter(adapter);
    }

    //METHOD WHICH WILL HANDLE DYNAMIC INSERTION
    public void addItems(View v) {
        listItems.add("Clicked : "+clickCounter++);
        adapter.notifyDataSetChanged();
    }
}

android.R.layout.simple_list_item_1 एंड्रॉइड द्वारा आपूर्ति की गई डिफ़ॉल्ट सूची आइटम लेआउट है, और आप गैर-जटिल चीजों के लिए इस स्टॉक लेआउट का उपयोग कर सकते हैं।

listItemsएक सूची है जो सूची दृश्य में दिखाए गए डेटा को रखती है। सभी सम्मिलन और हटाने पर किया जाना चाहिए listItems; परिवर्तनों listItemsको दृश्य में परिलक्षित किया जाना चाहिए। इसके द्वारा नियंत्रित किया जाता है ArrayAdapter<String> adapter, जिसका उपयोग करके सूचित किया जाना चाहिए:

adapter.notifyDataSetChanged();

एक एडाप्टर को 3 मापदंडों के साथ त्वरित किया जाता है: संदर्भ, जो आपका हो सकता है activity/listactivity; आपके व्यक्तिगत सूची आइटम का लेआउट; और अंत में, सूची, जो सूची में प्रदर्शित किया जाने वाला वास्तविक डेटा है।


2
मुझे समझ में नहीं आता है कि कैसे ListView खुद को हमारी गतिविधि में यहाँ संलग्न करता है।
ब्रीडली

7
@ ब्रीडली क्योंकि यह एक लिस्ट एक्टिविटी है न कि एक्टिविटी जिसमें लिस्ट व्यू वाला लेआउट है । आपको आईडी का दृश्य ढूंढने की आवश्यकता नहीं है। जैसा कि आप संदर्भ पर पढ़ सकते हैं ListActivity is an activity that includes a ListView as its only layout element by default. [...] (it) hosts a ListView object:। इसलिए, डिफ़ॉल्ट रूप से विधियां (as आदि एडेप्टर , आदि) कक्षा के अंदर "हैं"।
फ्लो

चलिए जब सही जवाब मिल जाता है तो खुशी दिखाते हैं: /
support_ms

1
यदि ArrayList में तत्व अधिक जटिल है जैसे कि इंटरनेट से लोड करना और प्रत्येक आइटम में छवि वीडियो और ऐसा कुछ है, तो क्या यह दृष्टिकोण प्रदर्शन हिट होगा?
जियोनी 14

1
मैं इसे एक टुकड़े में कैसे लागू कर सकता हूं?
उमर कांजी

64

के बजाय

listItems.add("New Item");
adapter.notifyDataSetChanged();

आप सीधे कॉल कर सकते हैं

adapter.add("New Item");

@gumuruh एडॉप्टर अपने आप में परिवर्तनशील है, इसलिए हम उन ऑब्जेक्ट्स को सीधे जोड़ या हटा सकते हैं, जो अपने आप लिस्ट के NotDatasetChanged () और getView () को प्राप्त करेंगे। इससे कोड की अतिरिक्त लाइन कम हो जाती है।
venkat530

इसलिए एडेप्टर में जोड़कर अपने आप ही सूचित करेंडेटासेटसेट ()? ओह मैं समझा। धन्यवाद @ venkat530 लेकिन सूची के बारे में क्या? मेरा मतलब है कि यदि पहले कहें तो उसने एक ऐसी सूची बनाई है जो एडॉप्टर के लिए डेटा कंटेनर के रूप में उपयोग की जाती है। और अब आप बस एक आइटम जोड़ने के लिए सीधे अनुकूलक के बजाय arraylist। क्या सरणी सूची डेटा अपडेट / अछूता है?
गमरु

1
@gumuruh दूसरा सबसे अच्छा अभ्यास है क्योंकि सिंक्रनाइज़ किया गया है।
रिकार्डो

1
@gumuruh सरसरी प्रयोग और ArrayAdapter स्रोत कोड [ github.com/android/platform_frameworks_base/blob/master/core/…] से , ऐसा लगता है कि अंतर्निहित डेटा सेट को भी संशोधित किया जाएगा।
CCJ

मुझे शार्दुल का जवाब काम कर गया, फिर इसे तोड़ दिया और यह पता नहीं लगा पाया कि इसे कैसे ठीक किया जाए। फुसफुसाहट पर, मैंने सोचा कि मैं इसे आज़माऊंगा, और वोइला, यह फिर से काम करता है! आपका बहुत बहुत धन्यवाद! हालांकि, मुझे नहीं पता कि इसे कैसे या क्यों तय किया। कोई उपाय?
donutguy640

55

सबसे पहले, आपको अपनी गतिविधि में एक ListView, एक EditText और एक बटन जोड़ना होगा। main.xml।

अब, आपकी गतिविधि में:

private EditText editTxt;
private Button btn;
private ListView list;
private ArrayAdapter<String> adapter;
private ArrayList<String> arrayList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    editTxt = (EditText) findViewById(R.id.editText);
    btn = (Button) findViewById(R.id.button);
    list = (ListView) findViewById(R.id.listView);
    arrayList = new ArrayList<String>();

    // Adapter: You need three parameters 'the context, id of the layout (it will be where the data is shown),
    // and the array that contains the data
    adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item, arrayList);

    // Here, you set the data in your ListView
    list.setAdapter(adapter);

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            // this line adds the data of your EditText and puts in your array
            arrayList.add(editTxt.getText().toString());
            // next thing you have to do is check if your adapter has changed
            adapter.notifyDataSetChanged();
        }
    });
}

यह मेरे लिए काम करता है, मुझे आशा है कि मैंने आपकी मदद की


4
बहुत अच्छी व्याख्या और विशेष रूप से एडेप्टर आइटम की व्याख्या के लिए धन्यवाद - जो जादुई रूप से सभी के उदाहरणों में प्रकट होता है। :)
त्रयोदशी

1
यह इस के लिए मुझे मिला सबसे अच्छा उदाहरण है :)
दिनुका साल्वथुरा

इस उत्तर ने उस व्यक्ति को संतुष्ट किया जो उस व्यक्ति ने मांगा था। जटिल सुधार के बिना सरल और साफ। शीर्ष उत्तर वास्तव में ListActivity का परिचय देता है, जिसके बारे में केवल भव्य स्वामी ही जानते हैं। मेरी एकमात्र समस्या अब यह है कि मैं सूची में विचारों और सामग्रियों को कैसे जोड़ूं। मुझे लगता है मैं केवल तार जोड़ रहा हूँ।

सूची ऑब्जेक्ट में 16 बिट पॉइंटर बनाने की तुलना में एडेप्टर में अनाम सूची ऑब्जेक्ट बनाने के लिए एक अनुकूलन हो सकता है। एडेप्टर बनाने के बाद जिसकी आवश्यकता नहीं है क्योंकि एडेप्टर में एक ऐड विधि है।

17

यदि आप ListActivity के बजाय AppCompatActivity में ListView रखना चाहते हैं, तो आप निम्न कार्य कर सकते हैं (@ Shardul का उत्तर संशोधित करना):

public class ListViewDemoActivity extends AppCompatActivity {
    //LIST OF ARRAY STRINGS WHICH WILL SERVE AS LIST ITEMS
    ArrayList<String> listItems=new ArrayList<String>();

    //DEFINING A STRING ADAPTER WHICH WILL HANDLE THE DATA OF THE LISTVIEW
    ArrayAdapter<String> adapter;

    //RECORDING HOW MANY TIMES THE BUTTON HAS BEEN CLICKED
    int clickCounter=0;
    private ListView mListView;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.activity_list_view_demo);

        if (mListView == null) {
            mListView = (ListView) findViewById(R.id.listDemo);
        }

        adapter=new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1,
                listItems);
        setListAdapter(adapter);
    }

    //METHOD WHICH WILL HANDLE DYNAMIC INSERTION
    public void addItems(View v) {
        listItems.add("Clicked : "+clickCounter++);
        adapter.notifyDataSetChanged();
    }

    protected ListView getListView() {
        if (mListView == null) {
            mListView = (ListView) findViewById(R.id.listDemo);
        }
        return mListView;
    }

    protected void setListAdapter(ListAdapter adapter) {
        getListView().setAdapter(adapter);
    }

    protected ListAdapter getListAdapter() {
        ListAdapter adapter = getListView().getAdapter();
        if (adapter instanceof HeaderViewListAdapter) {
            return ((HeaderViewListAdapter)adapter).getWrappedAdapter();
        } else {
            return adapter;
        }
    }
}

और आप का उपयोग करने के बजाय लेआउट में आप उपयोग android:id="@android:id/list"कर सकते हैंandroid:id="@+id/listDemo"

तो अब आप ListViewएक सामान्य के अंदर हो सकते हैं AppCompatActivity


12

MainActivity.java फ़ाइल के लिए कोड।

public class MainActivity extends Activity {

    ListView listview;
    Button Addbutton;
    EditText GetValue;
    String[] ListElements = new String[] {
        "Android",
        "PHP"
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listview = (ListView) findViewById(R.id.listView1);
        Addbutton = (Button) findViewById(R.id.button1);
        GetValue = (EditText) findViewById(R.id.editText1);

        final List < String > ListElementsArrayList = new ArrayList < String >
            (Arrays.asList(ListElements));


        final ArrayAdapter < String > adapter = new ArrayAdapter < String >
            (MainActivity.this, android.R.layout.simple_list_item_1,
                ListElementsArrayList);

        listview.setAdapter(adapter);

        Addbutton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                ListElementsArrayList.add(GetValue.getText().toString());
                adapter.notifyDataSetChanged();
            }
        });
    }
}

Activity_main.xml लेआउट फ़ाइल के लिए कोड।

<RelativeLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context="com.listviewaddelementsdynamically_android_examples
    .com.MainActivity" >

  <Button
    android:id="@+id/button1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/editText1"
    android:layout_centerHorizontal="true"
    android:text="ADD Values to listview" />

  <EditText
    android:id="@+id/editText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="26dp"
    android:ems="10"
    android:hint="Add elements listView" />

  <ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/button1"
    android:layout_centerHorizontal="true" >
  </ListView>

</RelativeLayout>

स्क्रीनशॉट

यहां छवि विवरण दर्ज करें


0

संक्षिप्त उत्तर: जब आप एक सूची दृश्य बनाते हैं तो आप इसे डेटा के संदर्भ में पास करते हैं। अब, जब भी इस डेटा को बदला जाएगा, यह सूची दृश्य को प्रभावित करेगा और इस प्रकार आइटम को इसमें जोड़ेगा, जब आप एडेप्टर को कॉल करेंगे। NotifyDataSetChanged () ;;

यदि आप RecyclerView का उपयोग कर रहे हैं, तो स्मृति को बचाने के लिए केवल अंतिम तत्व को अपडेट करें (यदि आपने इसे objs की सूची के अंत में जोड़ा है): mAdapter.notifyItemInserted (mItems.size () - 1);


0

यह सरल उत्तर है कि कैसे लिस्टव्यू android kotlin में डायनामिक रूप से डेटा को जोड़ा जाए

class MainActivity : AppCompatActivity(){

    var listItems = arrayListOf<String>()
    val array = arrayOf("a","b","c","d","e")
    var listView: ListView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.scrollview_layout)

        listItems.add("a")
        listItems.add("b")
        listItems.add("c")
        listItems.add("d")
        listItems.add("e")

        //if you want to add array items to a list you can try this for each loop
        for(items in array)
            listItems.add(items)
        Log.e("TAG","listItems array: $listItems")

    }
}

यहाँ मैंने सिर्फ दो तरीके बताये हैं, हम यह कई तरीके कर सकते हैं।


वह हिस्सा जहां आप इसे ListView में जोड़ते हैं?
ओनी मैनिगो

@OnieManiego यहाँ मैंने दो तरीकों से सूची में शामिल होने के लिए आइटम जोड़े, आप देख सकते हैं कि ऊपर 1. listItems.add ("a") listItems.add ("b") listItems.add ("c") listItems.add ("d) ") listItems.add (" e ") यह पहला तरीका है जिसे मैंने 2 में जोड़ा। (सरणी में आइटम) listItems.add (आइटम) के लिए दूसरा तरीका मैंने सरणी से सभी आइटम जोड़ा
sirajudheen tk

@OnieManiego मुझे आशा है कि यू समझे, अगर वह आपके लिए उपयोगी हो तो कृपया upvote
sirajudheen tk
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.