1、class PolicyFragmentInternal extends ListContentFragmentInternal
public class ListContentFragmentInternal extends BetterListFragmentInternal
在类BetterListFragmentInternal中设置了子类所要展示的内容,并设置了listview的条目点击事件与长按事件
在长按事件中,调用了 return li.onLongClick();的方法,而该方法返回false,
public boolean onLongClick() {
return false;
}
没有执行任何代码,长按事件没有执行
public final View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
/**
**protected int getListFragmentResource() {
** return R.layout.list_fragment;
**}
**R.layout.list_fragment为所要加载的布局
**/
View ret = inflater.inflate(getListFragmentResource(), container, false);
mTitleContainer = (ViewGroup)ret.findViewById(R.id.title_container);
mListView = (ListView)ret.findViewById(R.id.listview);
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Object item = mAdapter.getItem(arg2);
if (item instanceof ListItem) {
ListItem li = (ListItem)item;
onListItemClick(li);
li.onClickInternal(arg1);
}
}
});
mListView.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Object item = mAdapter.getItem(arg2);
if (item instanceof ListItem) {
ListItem li = (ListItem)item;
return li.onLongClick();
}
return false;
}
});
mEmpty = (TextView)ret.findViewById(R.id.empty);
onCreate(savedInstanceState, ret);
mListView.setAdapter(mAdapter);
return ret;
}
2、在类PolicyFragmentInternal中的onResume()方法中,调用了加载数据的方法
void load() {//从数据库中查找允许与拒绝的设备,在屏幕显示时调用
clear();//将adapter清空
items = new ArrayList<ListItem>();
final ArrayList<UidPolicy> policies = SuDatabaseHelper.getPolicies(getActivity());
SQLiteDatabase db = new SuperuserDatabaseHelper(getActivity()).getReadableDatabase();
try {
for (UidPolicy up: policies) {
int last = 0;
ArrayList<LogEntry> logs = SuperuserDatabaseHelper.getLogs(db, up, 1);
if (logs.size() > 0)
last = logs.get(0).date;
addPolicy(up, last);//将从数据路中查找到的数据封装成ListItem()对象,以供展示时调用
}
}
finally {
db.close();
}
}
void addPolicy(final UidPolicy up, final int last) {//将从数据库中查找的数据转换成java对象
java.text.DateFormat df = DateFormat.getLongDateFormat(getActivity());
String date;
if (last == 0)
date = null;
else
date = df.format(getLastDate(last));
int policyResource = up.getPolicyResource();
boolean allow = false;
if(R.string.allow == policyResource){
allow = true;
}else if(R.string.deny == policyResource){
allow = false;
}
//调用的是BetterListFragmentInternal中的方法。首先创建一个ListItem,然后将其添加到adapter中
ListItem li = addItem(policyResource, new ListItem(this, up.name, date,up.uid+"",allow) {
public void onClick(View view) {
super.onClick(view);
setContent(this, up);//点击条目后需要展示的条目
};
});
Drawable icon = Helper.loadPackageIcon(getActivity(), up.packageName);
if (icon == null)
li.setIcon(R.drawable.ic_launcher);
else
li.setDrawable(icon);
items.add(li);
}
真正的添加方法是调用的BetterListFragmentInternal中的
public ListItem addItem(String sectionName, ListItem item, int index) {
ListItemAdapter adapter = mAdapter.getSection(sectionName);
if (adapter == null) {
//为listview添加条目,并对其进行了排序
adapter = new ListItemAdapter(getContext());
mAdapter.addSection(sectionName, adapter);
if (mListView != null) {
mListView.setAdapter(null);
mListView.setAdapter(mAdapter);
}
// mAdapter.notifyDataSetChanged();
}
if (index != -1)
adapter.insert(item, index);
else
adapter.add(item);
mAdapter.notifyDataSetChanged();
return item;
}
3、主界面完整数据的展示
SeparatedListAdapter<T extends Adapter> extends BaseAdapter
在 BetterListFragmentInternal的onCreate()方法中,创建了mAdapter
@Override
public final void onCreate(Bundle savedInstanceState) {
mAdapter = new MyAdapter(getContext());
}
而 public class MyAdapter extends SeparatedListAdapter<ListItemAdapter> ,于是调用了SeparatedListAdapter的构造方法
public SeparatedListAdapter(Context context) {//getListHeaderResource()调的是ListContentFragmentInternal类中的
headers = new ArrayAdapter<String>(context, getListHeaderResource(), android.R.id.text1);
}
在该构造方法中创建了一个ArrayAdapter,其中的布局由getListHeaderResource()而得到
在BetterListFragmentInternal的public final View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 方法中
给listview设置了适配器mListView.setAdapter(mAdapter);
从而调用了SeparatedListAdapter的getView()方法
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int sectionnum = 0;
for (int i = 0; i < headers.getCount(); i++) {
String section = headers.getItem(i);
Adapter adapter = sections.get(section);
int size = adapter.getCount() + 1;
// check if position inside this section
if (position == 0)
return headers.getView(sectionnum, convertView, parent);//返回的是headers中getListHeaderResource()返回的布局
if (position < size)//调用的是BetterListFragmentInternal类中返回的方法
//调用的是mAdapter 中的getView()方法,展示的是BetterListFragmentInternal.this.getListHeaderResource()中的布局
return adapter.getView(position - 1, convertView, parent);
// otherwise jump into next section
position -= size;
sectionnum++;
}
return null;
}
superuser代码:http://download.csdn.net/detail/nicolelili1/8285919