কোনও তালিকাতে উপাদানগুলিকে কীভাবে যুক্ত করবেন অ্যান্ড্রয়েডে ডায়নামিকভাবে দেখুন


326

অ্যান্ড্রয়েডে একটি তালিকা তৈরির জন্য যে কেউ টিউটোরিয়াল ব্যাখ্যা বা পরামর্শ দিতে পারে?

আমার প্রয়োজনীয়তা এখানে:

  • আমার একটি বোতাম টিপে গতিশীলভাবে নতুন উপাদান যুক্ত করতে সক্ষম হওয়া উচিত।
  • বোঝার জন্য যথেষ্ট সহজ হওয়া উচিত (সম্ভবত কোনও কার্য সম্পাদনের উন্নতি বা রূপান্তর ছাড়া, উদাহরণস্বরূপ)

আমি জানি এই বিষয়টিতে বেশ কয়েকটি প্রশ্ন রয়েছে, এখানে স্ট্যাকওভারফ্লোতে পোস্ট করা হয়েছে, তবে আমার প্রশ্নের উত্তর দেবে এমন কোনও সন্ধান পাইনি। ধন্যবাদ!


3
শারদুলের বর্তমানে সর্বাধিক-ভোট দেওয়া উত্তরটিকে উচ্চ মানের হিসাবে বিবেচনা করা হয় এবং ব্যবহারকারীরা প্রকাশ করেছেন যে তারা এটি গ্রহণ করা উচিত বলে মনে করেন। আপনি এটি গ্রহণ বিবেচনা করতে পারেন?
ম্যাট ওয়েলক

উত্তর:


583

আপনার প্রকল্পের res/layout/main.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>

এটি শীর্ষে একটি বোতাম এবং নীচে একটি তালিকা ভিউ সহ একটি সাধারণ বিন্যাস। লক্ষ্য করুন ListViewid রয়েছে @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
আমি বুঝতে পারছি না যে এখানে তালিকাভিউ আমাদের ক্রিয়াকলাপের সাথে নিজেকে কীভাবে সংযুক্ত করে।
শৈশবে

7
@ ব্রিডলি কারণ এটি একটি তালিকাঅ্যাক্টিভিটি এবং এমন কোনও কার্যকলাপ নয় যা তালিকাভিউ সহ লেআউটযুক্ত । আপনার আইডির ভিউ খোঁজার দরকার নেই। হিসাবে আপনি রেফারেন্স উপর পড়তে পারেন: ListActivity is an activity that includes a ListView as its only layout element by default. [...] (it) hosts a ListView object। সুতরাং, ডিফল্টরূপে পদ্ধতিগুলি ( সেটএডাপ্টার হিসাবে ইত্যাদি) ক্লাসের "ভিতরে" থাকে।
fllo 1

সঠিক উত্তর
পেলে

1
অ্যারেলিস্টে উপাদান যদি আরও জটিল হয় যেমন ইন্টারনেট থেকে লোডিং এবং প্রতিটি আইটেমটিতে চিত্র ভিডিও এবং এর মতো কিছু থাকে তবে এই পদ্ধতির পারফরম্যান্স হিট হবে?
zionpi

1
আমি কীভাবে এটি একটি খণ্ডে বাস্তবায়ন করতে পারি?
ওমর কানজি

64

পরিবর্তে

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

আপনি সরাসরি কল করতে পারেন

adapter.add("New Item");

@ গুমুরুহ অ্যাডাপ্টারটি নিজেই পরিবর্তনযোগ্য, তাই আমরা সরাসরি অবজেক্টগুলিকে যুক্ত করতে বা অপসারণ করতে পারি যা স্বয়ংক্রিয়ভাবে তালিকাভুক্তের notifyDatasetChanged () এবং getView () কল করবে। এটি কোডের অতিরিক্ত লাইনকে হ্রাস করে।
venkat530

সুতরাং অ্যাডাপ্টারে যুক্ত হয়ে স্বয়ংক্রিয়ভাবে কল করুন notifyDatasetChanged ()? আচ্ছা বুঝলাম. ধন্যবাদ @ ভেঙ্কট ৫৩০ তবে তালিকার কী হবে? আমি যদি বলতে চাই যে প্রথমে তিনি একটি অ্যারেলিস্ট তৈরি করেছিলেন যা অ্যাডাপ্টারের জন্য ডেটা ধারক হিসাবে ব্যবহৃত হয়। এবং এখন আপনি অ্যারেস্টেস্টের পরিবর্তে সরাসরি অ্যাডাপ্টারে একটি আইটেম যুক্ত করুন। অ্যারেলিস্ট ডেটা আপডেট করা / ছোঁয়া হবে?
gumuruh

1
@ গুমুরুহ দ্বিতীয়টি অনুশীলন কারণ সিঙ্ক্রোনাইজ করা হয়েছে।
রিকার্ডো

1
@ গুমুরুহ কার্সারি পরীক্ষার থেকে এবং অ্যারেএডাপ্টার উত্স কোড [ github.com/android/platform_frameworks_base/blob/master/core/… , দেখে মনে হচ্ছে অন্তর্নিহিত ডেটা সেটটিও সংশোধন করা হবে।
সিসিজে

আমি শারদুলের উত্তরটি কাজ করে পেয়েছিলাম, তারপরে এটি ভেঙে দেয় এবং কীভাবে এটি মেরামত করতে হয় তা বুঝতে পারি না। এক ঝাঁকুনিতে, আমি ভেবেছিলাম আমি এটি চেষ্টা করে দেখব, এবং ভয়েলা, এটি আবার কাজ করে! আপনাকে অনেক ধন্যবাদ! যদিও, এটি কীভাবে বা কেন এটি স্থির করেছিল আমার কোনও ধারণা নেই। কোন ধারণা?
donutguy640

55

প্রথমে আপনাকে নিজের কার্যকলাপ_মিনি.এক্সএমএলে একটি তালিকাভিউ, একটি সম্পাদনা পাঠ এবং একটি বোতাম যুক্ত করতে হবে।

এখন, আপনার ক্রিয়াকলাপে:

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
এটি এর জন্য আমি খুঁজে পেয়েছি এটি সেরা উদাহরণ :)
দিনুকা সালওয়াথুড়া

এই উত্তরটি ব্যক্তি যা চেয়েছিল তা সন্তুষ্ট করেছিল। জটিল উন্নতি ছাড়াই সহজ এবং পরিষ্কার। শীর্ষের উত্তরটি আসলে তালিকার ক্রিয়াকলাপটি উপস্থাপন করে, যা কেবলমাত্র গ্র্যান্ড মাস্টাররা জানেন। এখন আমার একমাত্র সমস্যা হ'ল আমি কীভাবে তালিকার দর্শনগুলিতে ড্রয়যোগ্য এবং স্টাফ যুক্ত করব। আমার কাছে মনে হচ্ছে আমি কেবল স্ট্রিং যুক্ত করছি।

একটি অপ্টিমাইজেশন হতে পারে তালিকার অবজেক্টে 16 বিট পয়েন্টার তৈরি করার চেয়ে অ্যাডাপ্টারে নামবিহীন তালিকা অবজেক্ট তৈরি করা। অ্যাডাপ্টার তৈরির পরে যা প্রয়োজন হয় না কারণ অ্যাডাপ্টারের একটি অ্যাড পদ্ধতি রয়েছে।

17

আপনি যদি তালিকার ক্রিয়াকলাপের পরিবর্তে অ্যাপকম্প্যাটঅ্যাক্টিভিটিতে তালিকাটি দেখতে চান তবে আপনি নিম্নলিখিতটি করতে পারেন (@ শারদুলের উত্তরটি সংশোধন করে):

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

মেইনএ্যাকটিভিটি.জভা ফাইলের জন্য কোড।

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

কার্যকলাপ_মন.এক্সএমএল লেআউট ফাইলের জন্য কোড।

<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

সংক্ষিপ্ত উত্তর: আপনি যখন একটি তালিকা তৈরি করবেন তখন আপনি এটিকে ডেটার রেফারেন্সটি দিয়ে যান। এখনই, যখনই এই ডেটাটি পরিবর্তন করা হবে, তখন এটি তালিকার দৃশ্যের উপর প্রভাব ফেলবে এবং এইভাবে এটিতে আইটেমটি যুক্ত করবে, আপনি অ্যাডাপ্টারকে কল করার পরে notnotifyDataSetChanged () ;.

আপনি যদি একজন রিসাইক্লারভিউ ব্যবহার করছেন তবে মেমরিটি সংরক্ষণ করতে কেবলমাত্র শেষ উপাদানটি (যদি আপনি এটিগুলির তালিকাটির শেষে যুক্ত করেছেন) আপডেট করুন: এমএডাপ্টার.নোটাইফাইম আইটেমাইন্টার (এমআইটেমস.সাইজ () - 1);


0

তালিকা ভিউ অ্যান্ড্রয়েড কোটলিনে কীভাবে ডেটাসকে গতিশীলভাবে যুক্ত করবেন এটি সহজ উত্তর

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

    }
}

এখানে আমি দুটি উপায় ব্যাখ্যা করেছি, আমরা এটি অনেকগুলি উপায়ে করতে পারি।


আপনি যে অংশটি এটি তালিকাভিউতে যুক্ত করেছেন তা কোথায়?
ওনি ম্যানিয়েগো

@ অ্যানি ম্যানিয়েগো এখানে আমি দুটি উপায়ে তালিকাগুলিতে আইটেমগুলি যুক্ত করেছি, আপনি দেখতে পাচ্ছেন যে উপরে 1 টি। listItems.add ("a") listItems.add ("b") listItems.add ("c") listItems.add ("d) ") listItems.add (" e ") এই প্রথম উপায়ে আমি যুক্ত করেছি 2 (অ্যারে আইটেমের জন্য) তালিকা আইটেমস.এডিডি (আইটেম) দ্বিতীয় উপায়ে আমি অ্যারে থেকে সমস্ত আইটেম যুক্ত করেছি
সিরাজউদ্দিন tk

অ্যারেটি কি তালিকার ভিউ নয়? ধন্যবাদ
ওনি ম্যানিয়েগো

@OnieManiego আমি আশা করি বুঝতে পারছিস, যদি আপনি যে সহায়ক ভোট দিন Pls
sirajudheen টাকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.