使用片段中的适配器填充列表的最佳方法

时间:2014-08-01 17:59:12

标签: android android-fragments android-listview android-adapter

我开发了一个填充列表的应用程序。它的工作方式很好,但我不相信我以推荐的方式解决了问题。我读到你应该覆盖片段中的onActivityCreated并在那里填充列表,而不是在onCreateView中执行此操作。 onCreateView只应用于膨胀静态视图。这是真的?如果是的话,这两种方法到底应该怎么样?

这是我的片段类:

public class FragmentMain extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

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

    List<MyItem> items = createListItems();
    ListView listView = (ListView) view.findViewById(R.id.list);
    MyListAdapter adapter = new MyListAdapter(view.getContext(), items);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            Toast.makeText(view.getContext(),
                    "Clicked " + position, Toast.LENGTH_LONG)
                    .show();

        }
    });

    return view;
  }
.
.
.
}

我的MainActivity只添加片段:

public class MainActivity extends Activity {

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

        FragmentMain fm = new FragmentMain();
        getFragmentManager().beginTransaction()
                .add(R.id.fragment_main_container, fm).commit();

    }
.
.
.
}

1 个答案:

答案 0 :(得分:0)

这在某种程度上是正确的,因为onCreateView发生在UI线程上,你不希望任何减慢,否则你的UI会变得缓慢而不连贯。例如,在您的片段类中,您可以调用方法“createListItems()”。我不知道你正在制作多少项,但如果它很多,它可能会降低你的UI速度(特别是如果你访问数据库和查询对象等)。所以你可以在onActivityCreated中完成它,但你也可以使用AsyncTask。所以你的代码会变成这样:

public class LoadListObjectsTask extend AsyncTask<Void, List<MyItem>, Void> {

  private MyListAdapter myListAdapter;
  private Context mContext;

  public LoadListObjectsTask(Context context) {
     this.mContext = context;
  } 


  @Override 
   public void doInBackground(Void...params) {
     //create your list objects here instead of on UI thread. This will run on a separate thread.
   myListAdapter = new MyListAdapter(mContext, items);
   return items; //return list of MyItems
   }


   //This is called when doInBackground is done. THIS WILL RUN ON THE UI THREAD So don't do 
   //anything slow here
   @Override 
   public void onPostExecute(List<MyItem>...params //don't really need the list here//) {
     listView.setAdapter(myListAdapter);
   }
}

然后在你的片段中

public class FragmentMain extends Fragment {

private ListView listView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

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

    List<MyItem> items = new ArrayList<MyItem>();
    listView = (ListView) view.findViewById(R.id.list);

   //new code
    new LoadListObjectsTask(getActivity()).execute();

    listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            Toast.makeText(view.getContext(),
                    "Clicked " + position, Toast.LENGTH_LONG)
                    .show();

        }
    });

    return view;
  }

 public void onResume()... {
  //also add the task here so your content is reloaded on resume..
  new LoadListObjectsTask(getActivity()).execute();
 }
.
.
.
}

如果您不想这样做,只需将MyItems列表设为私有字段并移动

即可
List<MyItem> items = createListItems();

到onActivityCreated()。

希望有所帮助!