Android开发之ListFragment结合LoaderManager加载数据
来源:互联网 发布:一首歌火了网络歌手 编辑:程序博客网 时间:2024/05/18 00:26
之前实现过Android开发之ContentProvider结合LoaderManager加载数据,现在来实现用ListFragment加载
先看main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.listfragmentloadermanager.MainActivity" > <LinearLayout android:id="@+id/left" android:layout_width="0sp" android:layout_weight="1" android:layout_height="match_parent" android:orientation="vertical" > <EditText android:id="@+id/editText1" android:layout_width="match_parent" android:layout_height="wrap_content" > <requestFocus /> </EditText> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="添加姓名" /> </LinearLayout> <LinearLayout android:id="@+id/right" android:layout_width="0sp" android:layout_weight="2" android:layout_height="match_parent" android:orientation="vertical" > </LinearLayout></LinearLayout>
说明:右边的linearlayout是要加载listFragment的子类的,通过“添加”按钮实现
由于是listFragment的子类,所以还是需要布局文件的(就是listfragment的默认布局)
list.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@id/android:list" android:layout_width="match_parent" android:layout_height="match_parent" android:drawSelectorOnTop="false" /></LinearLayout>
这里我们把listview每一项的item也自定义,就用最简单的textview
item.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TextView" /></LinearLayout>
讲完了布局,我们来谈谈MainActivity.java和RightFragment.java
MainActivity.java
package com.example.listfragmentloadermanager;import android.app.Activity;import android.app.FragmentTransaction;import android.content.ContentResolver;import android.content.ContentValues;import android.net.Uri;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;public class MainActivity extends Activity { private Button button; private EditText editText; private FragmentTransaction transaction; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //加载listfragment transaction = getFragmentManager().beginTransaction(); RightFragment rightFragment = new RightFragment(); transaction.replace(R.id.right, rightFragment); transaction.commit(); editText = (EditText)findViewById(R.id.editText1); button = (Button)findViewById(R.id.button1); button.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { String name = editText.getText().toString(); ContentResolver resolver = getContentResolver(); Uri uri = Uri.parse("content://com.example.loadermanagertest2." + "PersonContentProvider/person"); ContentValues values = new ContentValues(); values.put("name", name); resolver.insert(uri, values); } }); }}
为什么这里不需要初始化LoaderManager呢?因为LoaderManager监听的是listview和contentprovider的数据变化。而这个例子的listview在listfragment里面,所以要挪到listfragment里面初始化
RightFragment.java:
package com.example.listfragmentloadermanager;import java.util.ArrayList;import java.util.List;import android.app.ListFragment;import android.app.LoaderManager;import android.app.LoaderManager.LoaderCallbacks;import android.content.CursorLoader;import android.content.Loader;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;public class RightFragment extends ListFragment implements LoaderCallbacks<Cursor>{ private LoaderManager loaderManager; private MyAdapter adapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { loaderManager.initLoader(0, null, this); View view = inflater.inflate(R.layout.list, null); return view; } //onCreate里面初始化一些参数,而onCreateView里面创建布局 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); loaderManager = getLoaderManager(); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { Uri uri = Uri.parse("content://com.example.loadermanagertest2." + "PersonContentProvider/person"); CursorLoader loader = new CursorLoader(getActivity(), uri, null, null, null, null); return loader; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { List<String> list = new ArrayList<String>(); while (data.moveToNext()) { list.add(data.getString(data.getColumnIndex("name"))); } adapter = new MyAdapter(); adapter.bindData(list); setListAdapter(adapter); adapter.notifyDataSetChanged(); } @Override public void onLoaderReset(Loader<Cursor> loader) { } //自定义adapter取数据 class MyAdapter extends BaseAdapter { private List<String> list; public void bindData(List<String> list) { this.list = list; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; if (convertView == null) { view = LayoutInflater.from(getActivity()).inflate( R.layout.item, null); } else { view = (View) convertView; } TextView textView = (TextView) view.findViewById(R.id.textView1); textView.setText(list.get(position).toString()); return view; } }}
接下来就是实验结果
当然,com.example.loadermanagertest2.PersonContentProvider也就是上一篇这里写链接内容提到的manifest清单文件android:exported=”true”才行
0 0
- Android开发之ListFragment结合LoaderManager加载数据
- Android开发之ContentProvider结合LoaderManager加载数据
- Android开发之ContentProvider结合LoaderManager加载数据
- Android开发之ContentProvider结合LoaderManager加载数据(图文源代码分享)
- andoird---loadermanager和contentprovider结合,加载数据
- Android之数据存储----使用LoaderManager异步加载数据库
- 【Android】使用LoaderManager管理Loader实现异步动态加载数据
- AndroidのLoaderManager管理Loader实现异步动态加载数据
- 【Android 开发教程】ListFragment
- android之ListFragment
- Android API之ListFragment
- Android加载器LoaderManager.loaderCallbacks
- Android App组件之ListFragment
- Android之LoaderManager的使用
- android之LoaderManager原理分析
- Android加载器LoaderManager.LoaderCallbacks的使用
- Android加载器LoaderManager.LoaderCallbacks的使用
- Android加载器LoaderManager.LoaderCallbacks的使用
- 用C语言实现大小端判断
- PHP系统时区设置
- 在SAS中创建空数据集的几种方法
- Notification的用法
- for 循环中植入两个变量
- Android开发之ListFragment结合LoaderManager加载数据
- UVA 437The Tower of Babylon - 简单dp
- 标签嵌套规范、网站结构制作实例笔记
- Java基础 常见List实现原理 - ArrayList
- Codeforces 631C-Report
- 单例模式,只要一个就够啦!
- 告诫自己要有目标
- 无法启动 Windows Event Log vpdn 无法启动 附带无法启动MYSQL服务”1067 进程意外终止”
- mysql 过程 动态执行sql