অ্যাডাপ্টারের ডেটা পরিবর্তিত হলে তালিকার ভিউ আপডেট করা


104

অ্যারে অ্যাডাপ্টারের সাথে সম্পর্কিত ডেটা পরিবর্তিত হলে, তালিকাটি অবৈধ করা আপডেট হওয়া মানগুলি দেখানোর জন্য যথেষ্ট? নিম্নলিখিত কোডের টুকরোটি কাজ করছে না, আমি কি এখানে কিছু ভুল বুঝেছি?

public class ZeroItemListActivity extends Activity {
    private ArrayList<String> listItems=new ArrayList<String>();
    private ListView mMyListView;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mMyListView=(ListView) findViewById(R.id.MyListView);
        mMyListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,listItems));
    }
    public void addItem(View v){
        listItems.add("list Item");
        mMyListView.invalidate();
    }
}

লেআউট ব্যবহৃত:

<?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">
    <TextView android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:text="@string/hello" />
    <ListView android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:id="@+id/MyListView"></ListView>
    <Button android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:id="@+id/AddItemsButton"
        android:text="Add Items" android:onClick="addItem"></Button>
</LinearLayout>

উত্তর:


172

প্রতিস্থাপন:

mMyListView.invalidate();

জন্য:

((BaseAdapter) mMyListView.getAdapter()).notifyDataSetChanged(); 

যদি এটি কাজ করে না, এই থ্রেডটি দেখুন: অ্যান্ড্রয়েড তালিকার ভিউ রিফ্রেশ


@ ব্লাইন্ডস্টফ যদি আমাকে তালিকার একক আইটেমটি আপডেট করতে হয় তবে আমাকে কী করতে হবে
বিকাশকারী

যদি বেসএডাপ্টারের অস্তিত্ব না থাকে, তবে ডেটাসেটচ্যাঞ্জড () প্রদর্শিত হবে না, তাই আপনাকে পরিবর্তন BaseAdapterকরতে হবেYourCustomAdapter
জুনিয়র মেহে

12

এই লাইনটি পরিবর্তন করুন:

mMyListView.setAdapter(new ArrayAdapter<String>(this, 
                           android.R.layout.simple_list_item_1, 
                           listItems));

প্রতি:

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

এবং একটি তালিকা আইটেমের মান আপডেট করার পরে, কল করুন:

adapter.notifyDataSetChanged();

3

invalidate();তালিকান দর্শনটিকে নিজেকে অকার্যকর করতে ডেকে তোলে (অর্থাত্ পটভূমির রঙ)
invalidateViews();তার সমস্ত বাচ্চাকে অবৈধ করতে কল করে। আপনাকে বাচ্চাদের মতামত আপডেট করার অনুমতি দেয়

আমি অনুমান করি যে এটির কিছু ধরণের দক্ষতার জিনিসটি সমস্ত আইটেমকে প্রতিরোধ করার জন্য অবিচ্ছিন্নভাবে পুনরায় আঁকতে হবে।


2

আমি এমন একটি সমাধান পেয়েছি যা বর্তমানে গৃহীত উত্তরের চেয়ে বেশি দক্ষ, কারণ বর্তমান উত্তর সমস্ত তালিকা উপাদানকে সতেজ করতে বাধ্য করে। আমার সমাধানটি কেবলমাত্র একটি উপাদানকে রিফ্রেশ করবে (এটি স্পর্শ করা হয়েছিল) অ্যাডাপ্টারগুলিকে গেট ভিউ কল করে এবং বর্তমান দৃশ্যের পুনর্ব্যবহার করে যা আরও বেশি দক্ষতা যুক্ত করে।

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
      // Edit object data that is represented in Viewat at list's "position"
      view = mAdapter.getView(position, view, parent);
    }
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.