SuperUser总结二

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

su:http://u.download.csdn.net/upload/success

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值