自己實現的一個Android上面TreeView效果

來源:互聯網
上載者:User

研究了一段時間終於實現了TreeView的效果,現在把這個分享給大家,希望能再給出好的建議。這個的思路是:按照類似於“樹”的結構組織資料,介面上直接利用大家經常用的listview實現的。下面這個是節點資訊的類:
public class PDFOutlineElement {
    private String id;//當前節點的id
    private String outlineTitle ;//節點上面顯示的資訊
    private boolean mhasParent ; //是否有父節點
    private boolean mhasChild ;//是否有孩子節點
    private String parent;//父節點的id
    private int level;//當前節點所在的層次
}
在這裡我想解釋一下這個level,是很關鍵的,他表示的是當前節點所在的層次,不要小看他,正是他協助我們在介面上顯示出來了層次效果,其實這個樹形結構並不是樹形結構,所有的資料都維護在一個ArrayList裡面,某一個節點A下面有子節點B、C,其實A、B、C這三個節點在ArrayList裡面是順序存放的,如果A的層次是level,那個他的子節點的層次是level+1,我們在getView()的時候我們可以不藉助系統自動給我們畫上,而是可以自己指定他的位置holder.icon.setPadding(25 * (level + 1), holder.icon.getPaddingTop(), 0, holder.icon.getPaddingBottom());,這樣他的子節點便具有了縮排的效果。
還有比較關鍵的點是如何?“展開”和 “縮回”的效果,其實這個只不過 是當單擊摸個節點的時候,如果這個節點下面有子節點而且是“縮回”的,就把他的所有的子節點都從那個ArrayList裡面刪除調,然後 notifyDataSetChanged(),同理就是“展開”的時候,就是在這個節點後面添加子節點到ArrayList裡面,然後 notifyDataSetChanged()。
其實說到這裡大家應該知道怎麼做了,這個樹形結構不是真樹,而就是一個ListView,通過往ArryList裡面添加刪除資料控制資訊,通過setPadding()實現縮排 
明白了這個思路,我把getView解釋一下,大家可定能做出來

public View getView(int position, View convertView, ViewGroup parent) {            ViewHolder holder;            /*if (convertView == null) {*/                convertView = mInflater.inflate(R.layout.outline, null);                holder = new ViewHolder();                holder.text = (TextView) convertView.findViewById(R.id.text);                holder.icon = (ImageView) convertView.findViewById(R.id.icon);                convertView.setTag(holder);            /*} else {                holder = (ViewHolder) convertView.getTag();            }*/            int level = mfilelist.get(position).getLevel();//每次根據節點的層次繪製顯示的位置             holder.icon.setPadding(25 * (level + 1), holder.icon                    .getPaddingTop(), 0, holder.icon.getPaddingBottom());            holder.text.setText(mfilelist.get(position).getOutlineTitle());                      //如果有孩子而且當前是不是展開的表徵圖設定為“+”號的表徵圖            if (mfilelist.get(position).isMhasChild()                    && (mfilelist.get(position).isExpanded() == false)) {                holder.icon.setImageBitmap(mIconCollapse);            } else if (mfilelist.get(position).isMhasChild()                    && (mfilelist.get(position).isExpanded() == true)) {                      //如果有孩子而且當前是不是展開的表徵圖設定為“+”號的表徵圖                holder.icon.setImageBitmap(mIconExpand);            } else if (!mfilelist.get(position).isMhasChild()){                holder.icon.setImageBitmap(mIconCollapse);                holder.icon.setVisibility(View.INVISIBLE);//這裡不要設定為GONE,因為GONE不顯示而且不佔位置的,而INVISIBLE是不顯示但是佔位置的            }            return convertView;        }

  這裡要特別說明的是/*if (convertView == null) {*/將這個注釋掉,按照平時的做法,我們都是第一次建立,以後再用就不用建立了,但是這樣會有問題,因為我們是動態向ArrayList裡面添加、刪除資料,如果添加刪除完資料 後調用setListAdapter,那麼每次重新載入資料,這樣會出現不管你在哪裡點擊都會回到最上面,樹形結構短的話看不出來,長的話就看出來了,所以每次重新載入資料後調用的是notifyDataSetChanged(),但是這個也有問題,就是“+”、“-”號的表徵圖顯示換亂,多點幾次表徵圖全部沒有了,原因就在於每次getView的時候沒有重新inflate,所以每次重新載入就可以了

經過朋友的指點,上面有一個不太對的地方在這裡改正一下
   if (convertView == null) {
       convertView = mInflater.inflate(R.layout.outline, null);
       holder = new ViewHolder();
       holder.text = (TextView) convertView.findViewById(R.id.text);
       holder.icon = (ImageView) convertView.findViewById(R.id.icon);
       convertView.setTag(holder);
   } else {
       holder = (ViewHolder) convertView.getTag();
   }
   
   holder.icon.setVisibility(View.VISIBLE);

參考:http://www.apkbus.com/android-14030-1-1.html

歡迎大家關注微博:http://e.weibo.com/u/2975543812

2012安卓巴士開發人員沙龍成都站大家抓緊報名 詳見:http://www.apkbus.com/android-72722-1-1.html

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.