ListView的學習

ListView的學習
創建ListView的步驟
1:佈局裏創建ListView控件
2:給ListView創建每一個的item佈局
3:準備數據源
4:在Adapter裏適配數據
5:給ListView設置適配器

適配器裏的4個抽象方法:
getCount(); 返回數據源的個數
getItem();返回條目
getItemId();返回條目id
getView();//適配器裏最重要的方法,設置數據適配的過程.
一開始獲取LayoutInflater的實例,用它的實例來獲取item佈局的layout
然後獲取控件 設置數據 返回view


最簡單的listview

public class MainActivity extends AppCompatActivity {
    private List<String> mAppName;

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

       ListView mListView = (ListView) findViewById(R.id.list_view);

        mAppName = new ArrayList<>();
        mAppName.add("QQ");
        mAppName.add("旺旺");
        mAppName.add("喵喵");

        mListView.setAdapter(new mAdapter());
    }

    class mAdapter  extends BaseAdapter{

        @Override
        public int getCount() {
            return mAppName.size();
        }

        @Override
        public Object getItem(int position) {
            return mAppName.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            /**
             * 在實際開發中LayoutInflater這個類還是非常有用的,它的作用類似於findViewById()。不同點是LayoutInflater是用來找res/layout/下的xml佈局文件,並且實例化;而findViewById()是找xml佈局文件下的具體widget控件(如Button、TextView等)。 具體作用:

             1、對於一個沒有被載入或者想要動態載入的界面,都需要使用LayoutInflater.inflate()來載入;

             2、對於一個已經載入的界面,就可以使用Activiyt.findViewById()方法來獲得其中的界面元素。

             獲得 LayoutInflater 實例的三種方式:

             1.LayoutInflater inflater = getLayoutInflater();  //調用Activity的getLayoutInflater()

             2.LayoutInflater localinflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

             3. LayoutInflater inflater = LayoutInflater.from(context);
             */
            LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.item_app_view,null);

            ImageView mIcon = (ImageView) convertView.findViewById(R.id.item_app_icon);
            TextView mText = (TextView)convertView.findViewById(R.id.item_app_text);

            mText.setText(mAppName.get(position));

            return convertView;
        }
    }





獲取系統已安裝的列表Demo和添加頭佈局,listView點擊事件

轉自:http://blog.csdn.net/maoxiao1229/article/details/38301657/#comments
方法1:ResolveInfo
獲取全部應用:  
    PackageManager packageManager = getPackageManager();  
    Intent mIntent = new Intent(Intent.ACTION_MAIN, null);  
    mIntent.addCategory(Intent.CATEGORY_LAUNCHER);  
    List<ResolveInfo> listAllApps = packageManager.queryIntentActivities(mIntent, 0); 
    判斷是否系統應用:  
    ResolveInfo appInfo = listAllApps.get(position);  
    String pkgName = appInfo.activityInfo.packageName;//獲取包名  
    //根據包名獲取PackageInfo mPackageInfo;(需要處理異常)  
    mPackageInfo = mContext.getPackageManager().getPackageInfo(pkgName, 0);  
    if ((mPackageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) {  
            //第三方應用  
        } else {  
            //系統應用  
        }  
獲取相關信息:  
ResolveInfo mResolveInfo ;  
獲取包名: mResolveInfo.activityInfo.packageName;  
獲取icon: mResolveInfo.loadIcon(packageManager);  
獲取應用名: mResolveInfo.loadLabel(packageManager).toString();  


方法2:PackageInfo
獲取全部應用:  
PackageManager packageManager = this.getPackageManager();   
List<PackageInfo> packageInfoList = packageInfoList .getInstalledPackages(0);    
判斷是否系統應用:  
 List<PackageInfo> apps = new ArrayList<PackageInfo>();  
 for (int i = 0; i < packageInfoList.size(); i++) {  
            PackageInfo pak = (PackageInfo)packageInfoList.get(i);  
            //判斷是否爲系統預裝的應用  
            if ((pak.applicationInfo.flags & pak.applicationInfo.FLAG_SYSTEM) <= 0) {  
                // 第三方應用  
                apps.add(pak);  
            } else  
        {  
        //系統應用  
        }  
        }  
獲取相關信息:  
PackageInfo mPackageInfo;  
獲取包名: mPackageInfo.packageName  
獲取icon: mPackageInfo.getApplicationIcon(applicationInfo);  
獲取應用名: mPackageInfo.getApplicationLabel(applicationInfo);  
獲取使用權限:  
mPackageInfo.getPackageInfo(packageName,PackageManager.GET_PERMISSIONS).requestedPermissions;  

跳轉系統應用

 //獲取包名
                String packageName = mAppInfos.get(position).activityInfo.packageName;
                //獲取應用名
                String className = mAppInfos.get(position).activityInfo.name;
                //通過調用Intent中的setComponent方法,我們可以打開另外一個應用中的Activity或者服務。
                //實例化一個ComponentName需要兩個參數,第一個參數是要啓動應用的包名稱,這個包名稱是指清單文件中列出的應用的包名稱:
                ComponentName componentName = new ComponentName(packageName,className);
                Intent intent = new Intent();
                intent.setComponent(componentName);
                startActivity(intent);

Demo程序:

public class MainActivity extends AppCompatActivity {

    private List<ResolveInfo> mAppInfos;
    private ListView mListView;
    private PackageManager manager;

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

    }

    private void initView() {
        mListView = (ListView) findViewById(R.id.list_view);
    }

    private void initData() {
        //給ListView添加頭佈局
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View inflate = inflater.inflate(R.layout.item_header_view,null);
        mListView.addHeaderView(inflate);
        //獲取包管理器實例
        manager = getPackageManager();
        Intent mIntent = new Intent(Intent.ACTION_MAIN, null);
        mIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        //獲取系統所有app信息
        mAppInfos = manager.queryIntentActivities(mIntent, 0);
        mListView.setAdapter(new mAdapter());
    }

    private void initListener() {
        //給listView設置條目點擊事件
        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //獲取包名
                String packageName = mAppInfos.get(position).activityInfo.packageName;
                //獲取應用名
                String className = mAppInfos.get(position).activityInfo.name;
                //通過調用Intent中的setComponent方法,我們可以打開另外一個應用中的Activity或者服務。
                //實例化一個ComponentName需要兩個參數,第一個參數是要啓動應用的包名稱,這個包名稱是指清單文件中列出的應用的包名稱:
                ComponentName componentName = new ComponentName(packageName,className);
                Intent intent = new Intent();
                intent.setComponent(componentName);
                startActivity(intent);
            }
        });

    }

    class mAdapter  extends BaseAdapter{

        @Override
        public int getCount() {
            return mAppInfos.size();
        }
        @Override
        public Object getItem(int position) {
            return mAppInfos.get(position);
        }
        @Override
        public long getItemId(int position) {
            return position;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.item_app_view,null);

            ImageView mIcon = (ImageView) convertView.findViewById(R.id.item_app_icon);
            TextView mText = (TextView)convertView.findViewById(R.id.item_app_text);

            //獲取應用名
            String appName = mAppInfos.get(position).activityInfo.loadLabel(manager).toString();
            //獲取應用圖片資源路徑
            Drawable drawable = mAppInfos.get(position).activityInfo.loadIcon(manager);
            //設置
            mText.setText(appName);
            mIcon.setImageDrawable(drawable);

            return convertView;
        }
    }


}


----------


----------

給getView增加ViewHolder優化點listView的性能
----------

      public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = new ViewHolder();
            //沒有複用view的時,使用viewholder保存找到的空間,下次複用不需要再次查找.
            if(convertView == null){
                LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.item_app_view,null);
                holder.mDrawable  = (ImageView) convertView.findViewById(R.id.item_app_icon);
                holder.mAppName = (TextView)convertView.findViewById(R.id.item_app_text);
                //給複用view設置標記
                convertView.setTag(holder);
            }else{
                //取出標記中的holder
                holder = (ViewHolder) convertView.getTag();
            }
            //獲取應用名
            String appName =mAppInfos.get(position).activityInfo.loadLabel(manager).toString();
            //獲取應用圖片資源路徑
            Drawable appDrawable =  mAppInfos.get(position).activityInfo.loadIcon(manager);
            holder.mAppName.setText(appName);
            holder.mDrawable.setImageDrawable(appDrawable);

            return convertView;
        }
    }

    class ViewHolder {
        TextView mAppName;
        ImageView mDrawable;
    }



ListViewDemo異步請求網絡,加載到listView中

public class RequestActivity extends AppCompatActivity{
    private List<lessonInfo> lessonInfos ;
    private static final String TAG = "RequestActivity";
    private final String STATUS;
    private final String MSG;
    private final String NAME;
    private ListView mListView;

    public RequestActivity() {
        STATUS = "status";
        MSG = "msg";
        NAME = "name";
    }

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

    }

    private void initView() {
        mListView = (ListView) findViewById(R.id.list_view);
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View footView = inflater.inflate(R.layout.item_header_view, null);
        //添加腳佈局
        mListView.addFooterView(footView);
    }

    class RequestAsyncTask extends AsyncTask<Void,Integer,String> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //Loading
        }
        //在異步裏請求數據
        @Override
        protected String doInBackground(Void... params) {
            return request(getString(R.string.request_url));
        }
        @Override
        protected void onPostExecute(String result) {
            //Loding結束,刷新數據,處理界面
            lessonResult lessonResult = new lessonResult();
            try {
                JSONObject jsonObject = new JSONObject(result);
                String status = jsonObject.getString(STATUS);
                String msg = jsonObject.getString(MSG);
                lessonResult.setmMessage(msg);
                lessonResult.setmStatus(status);

                List<lessonInfo> lessonInfos = new ArrayList<>();
                JSONArray dataArray = jsonObject.getJSONArray("data");
                for (int i = 0; i < dataArray.length(); i++) {
                    lessonInfo lessonInfo = new lessonInfo();
                    JSONObject tempJsonObject = (JSONObject) dataArray.get(i);
                    lessonInfo.setmName(tempJsonObject.getString("name"));
                    lessonInfos.add(lessonInfo);
                    Log.i(TAG, "onPostExecute: 11111111111111");
                }
                lessonResult.setmLessInfos(lessonInfos);

            } catch (JSONException e) {
                e.printStackTrace();
            }
            //設置適配器
            mListView.setAdapter(new RequestAdapter(RequestActivity.this,lessonResult.getmLessInfos()));
        }
    }

    //請求網絡,拿到數據
    private String request(String stringUrl) {
        try {
            URL url = new URL(stringUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            conn.setReadTimeout(30000);//設置連接超時時間
            conn.setRequestMethod("GET");//設置請求方式
            int Code = conn.getResponseCode();//獲取響應嗎
            if(Code == HttpURLConnection.HTTP_OK){//請求成功
                //開始下載
                InputStreamReader isr = new InputStreamReader(conn.getInputStream());
                BufferedReader br = new BufferedReader(isr);

                //用一個StringBuilder存儲數據
                StringBuilder sb = new StringBuilder();
                String line ;//讀取每行數據
               while ((line =br.readLine()) !=null){
                   sb.append(line);
               }
               return sb.toString();
            }else{

            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

}
public class RequestAdapter extends BaseAdapter {

    List<lessonInfo> infos = new ArrayList<>();
    Context mContext;

    public RequestAdapter(Context context, List<lessonInfo> info) {
        infos =info;
        mContext = context;
    }
    @Override
    public int getCount() {
        return infos.size();
    }

    @Override
    public Object getItem(int position) {
        return infos.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = new ViewHolder();

        if (convertView == null){
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.item_app_view,null);
            holder.mName = (TextView) convertView.findViewById(R.id.item_app_text);
            holder.mImageView = (ImageView) convertView.findViewById(R.id.item_app_icon);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }
        holder.mName.setText(infos.get(position).getmName());
        holder.mImageView.setVisibility(View.GONE);
        return convertView;
    }

    class ViewHolder {
        private TextView mName;
        private ImageView mImageView;
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章