天天看點

一個Android上面TreeView效果

研究了一段時間終于實作了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;

                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);

            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;

        }

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

一個Android上面TreeView效果
2011-1-1 15:21 上傳 下載下傳附件 (17.16 KB)
一個Android上面TreeView效果
2011-1-1 15:22 上傳 下載下傳附件 (32.08 KB)
一個Android上面TreeView效果
2011-1-1 15:23 上傳 下載下傳附件 (51.73 KB)
一個Android上面TreeView效果

2011-1-1 15:23 上傳 下載下傳附件 (45.47 KB)

經過朋友的指點,上面有一個不太對的地方在這裡改正一下

   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);

   ------

一個Android上面TreeView效果

TreeView.zip (63.05 KB, 下載下傳次數: 361) 2011-1-1 15:27 上傳 下載下傳次數: 361

下載下傳積分: e币 -1 元