How to Refresh ListView in Fragment that is filled with BaseAdapter?
Asked Answered
H

3

7

I want to Refresh a ListView in a Fragment when a Dialog is closed. Until now the refresh only works when I restart the app and I don't really know why.

Here are the classes:

This is the Fragment with the ListView on it, that i want to refresh, when the Dialog is closed.

public class RegisterListFragment extends Fragment {


    public static final String TAG = "RegisterListFragment";

    RegisterListAdapter adapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        setRetainInstance(true);
        // TODO Auto-generated method stub

        View view = inflater.inflate(R.layout.act_select_list_fragment, container, false);


        ListView list = (ListView) view.findViewById(R.id.register_list);
        list.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                                    long arg3) {
                Intent i = new Intent(getActivity(), com.example.smartkasse.Act_Register.MainActivity.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                TextView selectedRegisterTextView = (TextView) arg1.findViewById(R.id.title);
                String selectedRegisterName = (String) selectedRegisterTextView.getText();
                i.putExtra("selectedRegisterName", selectedRegisterName);
                startActivity(i);
                getActivity().finish();
            }
        });
        adapter = new RegisterListAdapter(getActivity());
        list.setAdapter(adapter);

        return view;
    }


    public void refreshData() {
        adapter.notifyDataSetChanged();
    }
}

And this is the Adapter I fill the List with:

public class RegisterListAdapter extends BaseAdapter {
    View view = null;

    Database db = new Database(mContext);
    data=db.getAlltitles();
    if(convertView==null)

    {

        view = (View) inflater.inflate(R.layout.act__select_listview, null);

        TextView title = (TextView) view.findViewById(R.id.title);
        TextView artist = (TextView) view.findViewById(R.id.artist);
        TextView duration = (TextView) view.findViewById(R.id.duration);
        ImageView thumb_image = (ImageView) view.findViewById(R.id.list_image);

        title.setText(data.get(position));
        //artist.setText(data.get(position));
        //duration.setText(data.get(position));
        //thumb_image.setImageResource(R.drawable.ic_launcher);

        return view;
    }

    else

    {

        TextView title = (TextView) convertView.findViewById(R.id.title);
        TextView artist = (TextView) convertView.findViewById(R.id.artist);
        TextView duration = (TextView) convertView.findViewById(R.id.duration);
        ImageView thumb_image = (ImageView) convertView.findViewById(R.id.list_image);

        title.setText(data.get(position));
        // artist.setText(data.get(position));
        // duration.setText(data.get(position));
        //thumb_image.setImageResource(R.drawable.ic_launcher);

        return convertView;
    }
}

And this is the Main that holds everything together:

When the positv Button of the Dialog is pressed, then new Data is added to the Database that i want

public class MainActivity extends SherlockFragmentActivity implements OnRegisterCreatedListener {
    RegisterListFragment registerListFragment;
    HelpFragment helpFragment;

    boolean helpVisible = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        // Grund-Layout für die Activity festlegen
        setContentView(R.layout.act_select_main);

        addFragments();

        supportInvalidateOptionsMenu();
        setLargeInLandscape();

    }

// Was passiert wenn der Menüknopf gedrückt wird

    // Inflate the menu; this adds items to the action bar if it is present.
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Zeigt nur die die nicht in Actionbar sind, kann aber eingestellt
        // werden im XML-File

        if (helpVisible) {
            getSupportMenuInflater().inflate(
                    R.menu.act_select_menu_help_visible, menu);

        } else {
            getSupportMenuInflater().inflate(
                    R.menu.act_select_menu_registerlist_visible, menu);
        }

        return true;
    }

    // Was passiert wenn ein Menüpunkt ausgewählt wird
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
            // Das wenn der Knopf das Plus war
            case R.id.menu_help:
                changeFragment();
                // this.supportInvalidateOptionsMenu();
                break;
            case android.R.id.home:
                changeFragment();
                // this.supportInvalidateOptionsMenu();
                break;
            case R.id.menu_add_register:
                FragmentManager fm = getSupportFragmentManager();

                NewRegisterFragment dialog = new NewRegisterFragment();
                dialog.setRetainInstance(true);
                dialog.show(fm, "fragment_name");
                break;
            // Listenelement hinzufügen und dem Adapter sagen es hat sich was
            // geändert, mach neu

        }
        return true;
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                if (helpVisible = true) {
                    // changeFragment();
                    helpVisible = false;
                    getSupportActionBar().setDisplayHomeAsUpEnabled(false);
                    supportInvalidateOptionsMenu();

                }
                break;

        }

        return super.onKeyDown(keyCode, event);
    }

    private void addFragments() {

        // Zuerst versuchen Fragmente aus dem Layout zu laden
        registerListFragment = (RegisterListFragment) getSupportFragmentManager()
                .findFragmentById(R.id.registerListFragment);
        helpFragment = (HelpFragment) getSupportFragmentManager()
                .findFragmentById(R.id.HelpFragment);

        // Wenn die Fragmente nicht im Layout sind, füge sie dynamisch hinzu
        if (registerListFragment == null && helpFragment == null) {

            FragmentTransaction ft = getSupportFragmentManager()
                    .beginTransaction();

            registerListFragment = new RegisterListFragment();

            helpFragment = new HelpFragment();

            ft.setCustomAnimations(android.R.anim.fade_in,
                    android.R.anim.fade_out, android.R.anim.fade_in,
                    android.R.anim.fade_out);

            ft.add(R.id.Fragmentframe, registerListFragment);
            ft.add(R.id.Fragmentframe, helpFragment);
            ft.show(registerListFragment);
            ft.hide(helpFragment);
            ft.commit();

            // OnclickListener für Fragmentwechseln

        }

    }

    private void changeFragment() {

        // Fragmente austauschen
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        if (registerListFragment.isVisible()) {
            ft.hide(registerListFragment);
            ft.show(helpFragment);

            helpVisible = true;
            supportInvalidateOptionsMenu();

            getSupportActionBar().setDisplayHomeAsUpEnabled(true);

            if (getSupportFragmentManager().findFragmentByTag(
                    "RegisterListFragment") == null) {
                ft.addToBackStack("RegisterListFragment");
            }
        } else {
            ft.hide(helpFragment);

            helpVisible = false;
            supportInvalidateOptionsMenu();
            getSupportActionBar().setDisplayHomeAsUpEnabled(false);

            fm.popBackStack();
        }

        ft.commit();
    }

    private void setLargeInLandscape() {
        if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            findViewById(R.id.menu_help).setVisibility(View.GONE);
        }
        if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            findViewById(R.id.menu_help).setVisibility(View.GONE);
        }

    }

    @Override
    public void OnRegisterCreated() {
        // TODO Auto-generated method stub
        registerListFragment.refreshData();

    }

to see in the listView "behind" the dialog. I tried so much, but i really didnt get it. Hope you can help me.

Thanks :)

Hamlen answered 7/6, 2013 at 18:25 Comment(1)
It's not good idea to load data in UI thread. Take a look to CursorLoader (developer.android.com/reference/android/content/…) or custom AsyncTaskLoader. To simply solve your problem you need to create new instance of your adapter and set it to ListViewDaughterly
O
5

You can do this

public void refresh(){
     adapter = new RegisterListAdapter(getActivity());
     list.setAdapter(adapter);
}

to refresh the listView or keep the data in memory with a different adapter.

EDIT: Sorry I didn't read well your question the first time, you can write this in your adapter:

public void addNewRow(String row){
    this.data.add(row);
    this.notifyDataSetChanged();
}
Originally answered 7/6, 2013 at 19:38 Comment(1)
Yeah, that worked for me. But I think this is not the "best practise" for doing this. Do you know how to solve this Problem nicer? Because this way i could also call getActivity.findViewbyId(R.id.list) and then add a new adapter. I think this is not the way you do this.Hamlen
D
1

Try ListView.invalidateViews() refresh content

Dustproof answered 7/6, 2013 at 18:33 Comment(5)
I tried list.invalidateViews instead of adapter.notifyDataSetChanged(); but it also didn't work -.-'Hamlen
Be shure that you data is changed before calling. Database.getAlltitles() - is returned result changed anywhen?Dustproof
The weird thing is that when the first Item is added and i close the Activity and start it again, then it works. I'm really confused.Hamlen
I think invalidateView will not halp because data loaded one time in adapter constructor. Try to create new instanse of adapter and set it to viewDaughterly
Thanks! This is working for me. You guys need to use together adapter.notifyDataSetChanged(); and after it list.invalidateViews() NOT INSTEAD OF!Magritte
B
0

I use Interface methods. create one Interface class

interface RefreshListview {
fun onValueChanged(myList: ArrayList<ModelTask>)}

In your Activity class implement the Interface and its method

class MenuAct : AppCompatActivity(), View.OnClickListener,RefreshListview

Inside the method take the changed list and set to your CustomAdapter

 override fun onValueChanged(myList: ArrayList<ModelTask>) {
        notesAdapter = AdapterTask(this, myList) // handle your own Adapter and listview `static` initilisations 
        lv_act_menu_daily.adapter = notesAdapter    }

Ohk now we are inside DialogFragment class

private var mCallback: RefreshListview? = null

This is importand

   override fun onAttach(activity: Activity?) {
    super.onAttach(activity)
    try {
        mCallback = activity as RefreshListview?
    } catch (e: ClassCastException) {
        Log.d("MyDialog", "Activity doesn't implement the RefreshListview interface")
    }
}

Inside onActivityCreated

try {
            // handle your actions
            dBHelper.deleteTaskByID(myProg.id!!)
            //get the current listview
            var daily = dBHelper.readAllTask(Util.getInstance(context).currentTime)
            //send it to Interface method  
            mCallback?.onValueChanged(daily)
            dismiss()
        }catch (e:Exception){
            e.printStackTrace()
        }
Berny answered 5/10, 2018 at 7:56 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.