Android: ListView not refreshing on notifyDataSetChanged();

后端 未结 1 1287
滥情空心
滥情空心 2021-01-02 23:03

I\'ve got a custom BaseAdapter and an add button in the main activity. The button opens a dialog with a textbox and you can add new elements to the list that way. The proble

相关标签:
1条回答
  • 2021-01-02 23:36

    It's normal that it doesn't refresh, you are adding an item to "lista" but the adapter keeps its own copy of that list, so or you set again the list in the adapter and then you call notifyDataChanged or you add the new item to the adapter.

    Anyway I see couple of weird things, I thing you could semplify everything using an array adapter, you don't need to implement add,etc. I wrote some code simplyfing yours:

    public class WeatherAppActivity extends ListActivity {
    
    Button buton;
    ItemsAdapter lista;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        List<String> initialList = new ArrayList<String>();
        initialList.add("Bucuresti");
        initialList.add("Sibiu");
    
        lista=new ItemsAdapter(this, initialList);
        buton=(Button)findViewById(R.id.button1);
        buton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                 lista.add(""+System.currentTimeMillis()); // e chiar getText()
                 lista.notifyDataSetChanged();
    
            }
        });
    
        setListAdapter(lista);
    
    }
    
    class ItemsAdapter extends ArrayAdapter<String> {
    
        public ItemsAdapter(Context context, List<String> list) {
            super(context, R.layout.lista, list);
        }
    
        @Override
        public View getView(final int position, View row, final ViewGroup parent) {
            final String item = getItem(position);
    
            ItemWrapper wrapper = null;
            if (row == null) {
                row = getLayoutInflater().inflate(R.layout.lista, parent, false);
                wrapper = new ItemWrapper(row);
    
                row.setTag(wrapper);
            } else {
                wrapper = (ItemWrapper) row.getTag();
            }
            wrapper.refreshData(item);
    
            return row;
        }
    
        class ItemWrapper {
    
            TextView text;
    
            public ItemWrapper(View row) {
                text = (TextView) row.findViewById(R.id.elementLista);
            }
    
            public void refreshData(String item) {
                text.setText(item);
            }
    
        }
        }    
    
    }
    

    These are the xml that I have used:

    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" >
    
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="63dp"
        android:text="Button" />
    
    <ListView
        android:id="@id/android:list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" >
    </ListView>
    
    </RelativeLayout>
    

    lista.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <TextView
        android:id="@+id/elementLista"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium" />
    
    </LinearLayout>
    

    This is the version of the adapter using a baseadapter:

    class ItemsBaseAdapter extends BaseAdapter {
    
    private List<String> items;
    private Context mContext;
    
    public ItemsBaseAdapter(Context context, List<String> list) {
        items = list;
        mContext = context;
    }
    
    public void addItem(String str) {
        items.add(str);
    }
    
    @Override
    public View getView(final int position, View row, final ViewGroup parent) {
        final String item = (String) getItem(position);
    
        ItemWrapper wrapper = null;
        if (row == null) {
            row = getLayoutInflater().inflate(R.layout.lista, parent, false);
            wrapper = new ItemWrapper(row);
    
            row.setTag(wrapper);
        } else {
            wrapper = (ItemWrapper) row.getTag();
        }
        wrapper.refreshData(item);
    
        return row;
    }
    
    class ItemWrapper {
    
        TextView text;
    
        public ItemWrapper(View row) {
            text = (TextView) row.findViewById(R.id.elementLista);
        }
    
        public void refreshData(String item) {
            text.setText(item);
        }
    
    }
    
    @Override
    public int getCount() {
        return items.size();
    }
    
    @Override
    public Object getItem(int position) {
        return items.get(position);
    }
    
    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }
    }
    

    And this is the version of the list item wich also include an imageview on the left:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >
    
    <ImageView 
        android:layout_height="wrap_content" 
        android:src="@android:drawable/btn_star_big_on" 
        android:scaleType="fitCenter" 
        android:layout_width="wrap_content" 
        />
    
    <TextView
        android:id="@+id/elementLista"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium" 
        />
    
    </LinearLayout>    
    
    0 讨论(0)
提交回复
热议问题