Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android小項目之--ListView與ListAcitivity完善論壇管理效果2(附源碼)

Android小項目之--ListView與ListAcitivity完善論壇管理效果2(附源碼)

編輯:Android開發實例

 ListAcitivity 類型布局用來配置應用程序,主要為顯示菜單列表、列表明細項目,假如讓程序繼承 ListActivity ,可以實現以下的方法:

  1. getListAdapter()  取得目前列表項目的 Adapter
  2. getListView()  取得目前列表的 View
  3. getSelectedItemId()  取得目前 Keypad 所選擇的 Item ID
  4. getSlectedItemPosition()  取得目前 KeyPad 所選擇的Item 索引值
  5. onContentChanged()  ListAcitivity 列表內容更動事件
  6. onListItemClick(ListView ,View ,int,long)  User在列表項目單擊觸發事件
  7. onRestoreInstanceState(Bundle)  當還原至此實例狀態事件
  8. setListAdapter(ListAdapter)  設置 ListAcitivity 的列表項目
  9. setSelection(int)    設置所選擇的項目  

  ListAcitivity 默認並不一定要像繼承自 Acitivity一樣,必須使用 seContentView 來設置版型 Layout 才能顯示頁面,ListAcitivity 可以在不必重寫 Protected void onCreate(Bundle savedInstanceState)的情況下,直接將列表加載至 ListAcitivity 中,非常便利,常用在如投票選項選擇、多個項目列表條列顯示、文件資源管理等。

  今天此程序將擴展上篇文章遺留下的問題,完善整個實例的全部功能,需要完成的功能清單如下:

  1. 實例繼承自 ListAcitivity 實現功能;
  2. 在另外一個類裡面實現 BaseAdapter 重寫它四個方法;
  3. 得到 ListView 控件裡面包含所有控件各自的事件,並為其設置事件監聽器;
  4. 長按時如何得到所觸發的項,並進行相應的操作,實現長按事件的點擊事件。

清單如上,下面是實例運行效果圖:



  這篇文章將不介紹如何加載數據給 ListView 具體操作你可以參考我這篇文章:http://www.fengfly.com/plus/view-181808-1.html,下面正式進入代碼片段,由於代碼量相對比較大,這裡就不全部發出代碼,感興趣的朋友可以到下面附件下載。   問題處理:
  1. 繼承 ListAcitivity 之後,我們main.xml將不可以再放任何控件,如果想再添加控件進行操作,可以自己寫擴展 XML。因為繼承了ListAcitivity 就可以直接在初始化時為調用 void android.app.ListActivity.setListAdapter(ListAdapter adapter)

    public void setListAdapter (ListAdapter adapter) 
    Since: API Level 1 
    Provide the cursor for the list view. 

    此方法,參數為ListAdapter,上篇我們是利用自己加載的 SimpleAdapter 的適配器做數據源,本篇因為繼承了 ListAcitivity 所以數據源我們可以這樣寫,重寫 BaseAdapter ,具體看問題2;

  2. 重寫 BaseAdapter 代碼如下:

    @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return listitem.size();
        }

        @Override
        public Object getItem(int arg0) {
            // TODO Auto-generated method stub
            return listitem.get(arg0);
        }

        @Override
        public long getItemId(int arg0) {
            // TODO Auto-generated method stub
            return arg0;
        }

        @Override
        public View getView(int arg0, View arg1, ViewGroup arg2) {
            // TODO Auto-generated method stub
            final ViewHolder myViewHolder;
            if(arg1==null)
            {
                
                arg1=myInflater.inflate(R.layout.listview_row, null);
                myViewHolder=new ViewHolder();
            
                ViewHolder.my_TextView=(TextView)arg1.findViewById(R.id.topTextView);
                ViewHolder.my_Button=(Button)arg1.findViewById(R.id.Button01);
                
                arg1.setTag(myViewHolder);
                
            }
            else
            {
                myViewHolder=(ViewHolder)arg1.getTag();
            }
            ViewHolder.my_TextView.setText(listitem.get(arg0).get("itemText").toString());
            ViewHolder.my_Button.setText(listitem.get(arg0).get("buttonText").toString());
            ViewHolder.my_Button.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    RelativeLayout rl = (RelativeLayout)v.getParent();
                    final TextView subView = (TextView)rl.getChildAt(1);
                    // TODO Auto-generated method stub
                    new AlertDialog.Builder(myContext)
                    .setTitle(R.string.confirm)
                    .setMessage(R.string.top)
                    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                        
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // TODO Auto-generated method stub
                            subView.setTextColor(Color.RED);
                        }
                    })
                    .setNeutralButton(R.string.cancel, null)
                    .show();
                }
            });
            
            ViewHolder.my_TextView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
                
                @Override
                public void onCreateContextMenu(ContextMenu menu, View v,
                        ContextMenuInfo menuInfo) {
                    // TODO Auto-generated method stub
                    ListViewActivity lv=(ListViewActivity)myContext;
                    lv.myRelative=(RelativeLayout)v.getParent();
                    menu.setHeaderIcon(R.drawable.icon);
                    menu.setHeaderTitle(ViewHolder.my_TextView.getText());
                    menu.add(1, 0, 0, "高亮");
                    menu.add(0, 1, 0, "置頂"); 
                }
                
            });
            
             
            return arg1;
        }

     

    構造函數為引入上篇上下文和數據;

    方法一:獲取數據源的總列數;
    方法二:通過參數值獲取每個集合的項;
    方法三:獲得當前項的索引;
    方法四:返回我們需要的View。
  3. LayoutInflater 的使用,LayoutInflater 這個類非常有用,它的作用類似於 findViewById() ,不同點的是 LayoutInflater 是用來找layout 下 xml 布局文件,並且實例化!而 findViewById() 是找具體 xml 下的具體 widget 控件(如: Button , TextView 等)。

    一般來講,我們用 LayoutInflater 做一件事:inflate。inflate這個方法總共有四種形式,目的都是把xml 表述的layout 轉化為ViewThis class is used to instantiate layout XML file into its corresponding View objects . It is never be used directly -- use getLayoutInflater() or getSystemService(String)getLayoutInflater() or getSystemService(String) to retrieve a standard LayoutInflater instance that is already hooked up to the current context and correctly configured for the device you are running on
      A. Context.public abstract Object getSystemService (String name) :Return the handle to a system-level service by name. The class of the returned object varies by the requested name. 具體參見文檔。
      B.種獲得LayoutInflater 的方法

        (1)通過SystemService獲得LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        (2)從給定的context中獲取
      C. LayoutInflater.inflate()
        Layout文件轉換為View,顧名思義,專門供Layout使用的Inflater。雖然Layout也是View的子類,但在android中    如果想將xml中的Layout轉換為View放入.java代碼中操作,只能通過Inflater,而不能通過findViewById()。
      
    D.findViewById() 有兩種形式
          R.layout.xx 是引用res/layout/xx.xml的布局文件(inflate方法),R.id.xx是引用布局文件裡面的組件,組件的id是xx...(findViewById方法)。看看R.java配置文件吧,R對文件分類管理,多寫幾個layout.xml後你會發現,所有的組件id都能用R.id.xx來查看,但是組件不在setContentView()裡面的layout中就無法使用,Activity.findViewById()會出現空指針異常
    詳細使用步驟如下:

private LayoutInflater myInflater=null;

 

 之後我們在

public View getView(int arg0, View arg1, ViewGroup arg2) {

 

方法裡面調用方法參數View arg1使用

arg1=myInflater.inflate(R.layout.listview_row, null);

 

 

即可得到相應的 View ,得到 View 之後即可以輕松的使用 findViewById() 方法操作控件,並為且設置對應的監聽事件。

4.上篇文章我們留下了一個問題,即如何在長按時能夠得到長按的某一項,並得到項操作相應的業務邏輯,本篇將完成此功能。在繼承 ListAcitivity 類裡聲明 public RelativeLayout myRelative; 此相對布局控件來源於布局XML的布局控件,之後在設置長按事件的處理函數中進行如下操作:

ListViewActivity lv=(ListViewActivity)myContext;
                lv.myRelative=(RelativeLayout)v.getParent();

 

上述代碼為,將上下文引入,得到上下文聲明的相對布局控件,因為方法的參數View 為相應的點擊控件,為了得到布局控件,使用View.getParent() 得到相對的父控件,這裡我用的是 TextView 它放在 RelativeLayout 此控件的下方法,故為getParent(),得到每次點擊項的布局控件後,再重寫onContextItemSelected ,代碼如下:

  public boolean onContextItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
        switch (item.getItemId()) {
        case 0:
            ViewHolder.my_TextView=(TextView)myRelative.getChildAt(1);
            ViewHolder.my_TextView.setBackgroundColor(Color.BLUE);
            return true;
        case 1:
            ViewHolder.my_TextView=(TextView)myRelative.getChildAt(1);
            Toast.makeText(this, ViewHolder.my_TextView.getText() "添加置頂效果", 1000).show();
            return true;
         
        }
        return super.onContextItemSelected(item);
    }

 

 

這裡有必要解釋一下,這一段實現菜單的選擇功能,應該放在 Activity 代碼類裡面,因為上面我們通過在此類中聲明一個 RelativeLayout 然後當點擊時我們即為它賦值,點擊完某一菜單按鈕後即返回 Activity 頁面,得到布局,我們在這裡要實現的只有通過操作相對布局控件裡面包含的控件然後進行操作即可完全實現 這一功能,在布局控件裡面找控件可用此方法 getChildAt(int index);注意上面條件分支語句不是跳出而是返回一個真。

到此,此功能己經得到實現,在此要感謝以下兩人對我的幫助:QQ:182041935---QQ120460734

 

源碼下載:/Files/TerryBlog/listViewDemo.rar

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved