问题
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 :)
回答1:
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();
}
回答2:
Try ListView.invalidateViews() refresh content
回答3:
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()
}
来源:https://stackoverflow.com/questions/16990644/how-to-refresh-listview-in-fragment-that-is-filled-with-baseadapter