【问题标题】:Gridview in a fragment populated with SQLite db - how to implement a callback to main activity?填充有 SQLite db 的片段中的 Gridview - 如何实现对主要活动的回调?
【发布时间】:2013-12-29 08:12:39
【问题描述】:

我有一个扩展 FragmentActivity 的 MainActivity。有两个片段。第一个包含由 SQLite 适配器类中的 Cursor 填充的 GridView。我已经分配了一个 onItemClick 事件来获取点击磁贴的数据。现在我需要将这些数据从片段传递给父活动,以便在第二个片段中使用它(根据 Android 开发最佳实践)。我查看了几个实现回调的示例,并尝试将其编码到我的应用程序中,但我必须遗漏一些非常明显的东西,因为我无法让它工作。这是第一个片段(我已经用 /* */ 标签编辑了回调位):

public class TimetableFragment extends Fragment {

private MobileClassDbAdapter mDbHelper;
private Cursor mTimetableCursor;
private ActionMode mActionMode;
/*    OnItemClickListener mListener;

public interface OnItemClickListener {
    public void OnItemClick(AdapterView<?> parent, View v, int position, long id);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        mListener = (OnItemClickListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString() + " must implement OnItemClickListener");
    }
}
*/    
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.timetable_fragment, container, false);

    GridView gridView = (GridView)view.findViewById(R.id.timetable_grid);
    fillTimetable(gridView);

    return view;
}

@SuppressWarnings("deprecation")
private void fillTimetable(GridView gridView) {
    mDbHelper = new MobileClassDbAdapter(getActivity().getApplicationContext());
    mDbHelper.open();
    // Get all of the rows from the database and create the item list
    mTimetableCursor = mDbHelper.fetchAllTimetableActivities();
    // check the length of the cursor
    int count = mTimetableCursor.getCount();
    int days = 5;
    int lessons = 9;
    int test = days * lessons;
    if (count < test) {
        Toast.makeText(getActivity(), "Not filled with timetable  activities", Toast.LENGTH_LONG).show();
        for (int i = 1; i <= days; i++) {
            for (int j = 1; j <= lessons; j++) {
                String day = Integer.toString(i);
                String lesson = Integer.toString(j);
                if (mDbHelper.findTimetableActivity(day, lesson, null, null) == false) {
                    mDbHelper.createTimetableActivity(day, lesson, null, null, null);
                }
            }
        mTimetableCursor = mDbHelper.fetchAllTimetableActivities();
        }
    }
    String[] from = new String[]{MobileClassDbAdapter.KEY_TIMETABLE_ACTIVITY,MobileClassDbAdapter.KEY_TIMETABLE_NOTE};

    int[] to = new int[]{R.id.timetable_text1,R.id.timetable_text2};

    // Now create a simple cursor adapter and set it to display
    final SimpleCursorAdapter timetable = new SimpleCursorAdapter(getActivity(), R.layout.timetable_card, mTimetableCursor, from, to);
    gridView.setAdapter(timetable);

    // create click listener
    gridView.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            //JUST A TEST TO SEE IF THE ClickListener RETURNS THE CORRECT DATA
            Cursor item = (Cursor)timetable.getItem(position);
            String text = item.getString(item.getColumnIndexOrThrow(MobileClassDbAdapter.KEY_TIMETABLE_DAY))
                    + " " + item.getString(item.getColumnIndexOrThrow(MobileClassDbAdapter.KEY_TIMETABLE_LESSON))
                    + " (id: " + item.getString(item.getColumnIndexOrThrow(MobileClassDbAdapter.KEY_TIMETABLE_ID)) + ")";
            Toast.makeText(getActivity(), text, Toast.LENGTH_LONG).show();
            //END OF TEST...
/*              mListener.OnItemClick(parent, v, position, id);*/
        }
    });

}
}

这里是 MainActivity:

public class MainActivity extends FragmentActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

}

我还没有包含第二个片段,因为我还没有开始编码 - 我首先需要从片段中获取数据到父活动。我真的需要一些建议...谢谢!

【问题讨论】:

    标签: android android-fragments android-sqlite android-gridview


    【解决方案1】:

    您的MainActivity 需要实现您的 Fragment 的接口。

    无论如何,您应该在 Fragment 中处理您的 onItemClick,并且只通知 Activity 有关结果。在您的情况下,您将获得有关 AdapterView、项目的视图和位置/id 的信息。但是您的 Activity 不知道 GridView...

    在 Fragment 内处理您的 onClick 并将所需结果传递给 Activity。

    因此你应该添加一个类似“itemClicked(InformationForActivity...)”的接口

    试试这个:

    public class TimetableFragment extends Fragment {
      ItemClickedListener mListener;
    
      public interface ItemClickedListener {
        public void onItemClicked(Item clickedItem);
      }
    
      @Override
      public void onAttach(Activity activity) {
         super.onAttach(activity);
         try {
            mListener = (CursorClickedListener ) activity;
         } catch (ClassCastException e) {
         throw new ClassCastException(activity.toString() 
         + " must implement CursorClickedListener ");
         }
       }
    
       @SuppressWarnings("deprecation")
       private void fillTimetable(GridView gridView) {
         ....
         Item item = ... ;// build your item
         mListener.onItemClick(item); //this informs the activity
       }
     }
    

    活动:

    public class MainActivity extends FragmentActivity 
                          implements TimetableFragment.ItemClickedListener {
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      }
    
      @Override
      public void ItemClickedListener (Item clickedItem){
      //inform the other fragment here!
      }
    }
    

    【讨论】:

    • 谢谢,它似乎已经到了我需要构建项目的地步……还不能弄清楚(对此有点菜鸟)。知道如何从我拥有的光标构建项目吗?我试过'Item item =(Item)timetable.findItem(position)'但没有运气......
    • 您必须自己构建它。取决于你有什么属性......你应该使用你自己的模型——我的“项目”只是一个例子。为此使用您自己的类(肯定是“小时”或“时间表”;))否则,如果您不想拥有特定项目,则可以只返回字符串;)
    • 谢谢一百万。我在此期间建造了它。你是救生员!
    猜你喜欢
    • 1970-01-01
    • 2016-11-20
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2016-06-15
    相关资源
    最近更新 更多