2015-02-09 90 views
1

我有一個主要活動,持有NavigationDrawerFragment的GridView適配器notifyDataSetChanged()(從機器人工作室模板服用) GridViewAdapter具有OnLongClickListener,通過在主回調運行SettingsFragment:在主從DialogFragment在片段

public void ShowSettings(Drink drink, int position) { 
     // DialogFragment.show() will take care of adding the fragment 
     // in a transaction. We also want to remove any currently showing 
     // dialog, so make our own transaction and take care of that here. 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     Fragment prev = getFragmentManager().findFragmentByTag("dialog"); 
     if (prev != null) { 
      ft.remove(prev); 
     } 
     ft.addToBackStack(null); 
     // Create and show the dialog. 
     DialogFragment settings = FragmentSettings.newInstance(drink, position); 

     settings.show(ft, "FragmentSettings"); 

GridViewAdapter:

public class GridViewAdapter extends BaseAdapter implements AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener { 

    private ArrayList<Drink> listDrink = new ArrayList<Drink>(); 
    private Activity activity; 
    private Context mContext; 
    private GridViewAdapterCallback callback; 

    public GridViewAdapter(Activity activity, ArrayList<Drink> listDrink) { 
     super(); 
     this.listDrink = listDrink; 
     this.activity = activity; 
    } 

    public GridViewAdapter(Context c) { 
     mContext = c; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return listDrink.size(); 
    } 

    @Override 
    public Drink getItem(int position) { 
     // TODO Auto-generated method stub 
     return listDrink.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 




    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     ViewHolder view; 
     LayoutInflater inflator = activity.getLayoutInflater(); 
     if (convertView == null) { 
      view = new ViewHolder(); 
      convertView = inflator.inflate(R.layout.grid_item, null); 

      view.txtViewTitle = (TextView) convertView.findViewById(R.id.tvName); 

      view.imgViewFlag = (ImageView) convertView.findViewById(R.id.imageView1); 

      view.txtViewCount = (TextView) convertView.findViewById(R.id.tvCount); 

      convertView.setTag(view); 
     } else { 
      view = (ViewHolder) convertView.getTag(); 
     } 

     view.txtViewTitle.setText(listDrink.get(position).getProductName()); 
     switch (listDrink.get(position).getType()) { 
      case (1): 
       view.imgViewFlag.setImageResource(R.drawable.btn_beer); 
       break; 
      case (2): 
       view.imgViewFlag.setImageResource(R.drawable.btn_dark); 
       break; 
      default: 
       view.imgViewFlag.setImageResource(R.drawable.btn_shot); 
       break; 


     } 

     int count = callback.SqliteCountProducts(listDrink.get(position).getProductName()); 
     view.txtViewCount.setText(String.valueOf(count)); 
//  notifyDataSetChanged(); 

     return convertView; 
    } 

    public void setCallback(GridViewAdapterCallback callback) { 

     this.callback = callback; 
    } 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
//  Log.d("My_Log", "On_click:" + position); 
     callback.SqliteSave(listDrink.get(position)); 
     notifyDataSetInvalidated(); 


    } 


    @Override 
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 
//  Log.d("My_Log", "On_long_click:" + position); 
     callback.ShowSettings(listDrink.get(position), position); 
     notifyDataSetInvalidated(); 
     return true; 
    } 

    public void UpdateGrid() { 
     notifyDataSetInvalidated(); 

    } 


    public interface GridViewAdapterCallback { 

     public int SqliteCountProducts(String product); 

     public void SqliteSave(Drink drink); 

     public void ShowSettings(Drink drink, int position); 
    } 

    public static class ViewHolder { 
     public ImageView imgViewFlag; 
     public TextView txtViewTitle; 
     public TextView txtViewCount; 
    } 


} 

GridFragment,保存的GridView適配器

public class GridFragment extends Fragment { 
    // ArrayList<Drink> listDrink = new ArrayList<Drink>(); 
    public GridViewAdapter mAdapter; 

    public GridFragment() { 
     // Required empty public constructor 
    } 

    public static GridFragment newInstance() { 
     GridFragment fragment = new GridFragment(); 
     return fragment; 
    } 



    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_grid, container, false); 
     // prepared arraylist and passed it to the Adapter class 
     mAdapter = new GridViewAdapter(getActivity(), ((Main) getActivity()).PrepareDefaultArray()); 
     GridView gridView = (GridView) view.findViewById(R.id.gvMain); 

     mAdapter.setCallback((GridViewAdapter.GridViewAdapterCallback) view.getContext()); 
     gridView.setAdapter(mAdapter); 
     gridView.setOnItemClickListener(mAdapter); 
     gridView.setOnItemLongClickListener(mAdapter); 



     return view; 
    } 

    @Override 
    public void onResume() { 

     super.onResume(); 
     UpdateArray(); 


    } 
    public void UpdateArray() { 
     mAdapter.notifyDataSetChanged(); 

    } 

的,只是需要的GridView項的onResume工作滑到屏幕背後和背部

我不知道如何使它工作正確。 :/

內容提供商?

我不能再拍回調到主 - 因爲它會導致循環

謝謝大家幫忙

回答

0

爲什麼你把UpdateArray()中的onCreate()? mAdapter尚未實例化。

@覆蓋 公共無效的onCreate(捆綁savedInstanceState){

super.onCreate(savedInstanceState); 
    UpdateArray(); 


} 

所以從onCreate()移動UpdateArray()onCreateView(),後gridView.setAdapter(mAdapter);


UPDATE:

而且還發表評論notifyDataSetInvalidated() ,因爲:

公共無效notifyDataSetInvalidated(): 通知所連接的觀察員底層數據不再有效或可用。一旦調用此適配器不再有效,不應報告更多的數據集更改。

+0

實驗痕跡) 感謝您迴應,但並沒有幫助:( 也許我需要 GridViewAdapter延伸BaseAdapter 到ArrayAdapter?因爲ArrayAdapter,因爲我讀過,發送notifydatasetchanges( )自動? – theendcomplete 2015-02-09 17:13:29

+0

ArrayAdapter實現BaseAdapter,所以將不會有差異,並且notifyDataSetChanged都適用於 – Xcihnegn 2015-02-11 09:09:56

+0

只是更新我的答案 – Xcihnegn 2015-02-11 09:19:04

相關問題