android 实现可伸缩的Listview控件

最近开发了一个小的任务管理器,但是想实现一个简单的类似树状结构的listview,这样在点击某一项的时候就可以展示更多的任务信息。

评论 (1)链接2011-08-30 
  • 0 支持
    @zhanlijia:
    用expandablelistview控件也可以啊
    – 刘锡涛 2012-09-13
  • 社区维基

    3 票

  • andev
    5586

可以考虑用ExpandableListActivity,不时的notify数据发生变化会影响用户体验的。

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2011-09-14

这种方式的实现主要是通过单个Item中来显示和隐藏图层来实现的,我们知道Android提供了loayout的方式类似网页的div,所以要实现这种功能和网页的方式差不多,通过图层id获取的图层,然后隐藏和显示就可以了。

  
package com.lp.activity;

import java.util.List;

import android.app.ListActivity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

import com.lp.bean.Help;
import com.lp.dao.HelpDao;

public class HelpActivity extends ListActivity {

private HelpDao dao;
private List<Help> helps;
private boolean[] mExpanded;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

dao = new HelpDao(this);
helps = dao.getAll();
mExpanded = new boolean[helps.size()];
for(int i=0;i<helps.size();i++){
mExpanded[i] = false;
}
setListAdapter(new SpeechListAdapter(this));
}


@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
((SpeechListAdapter)getListAdapter()).toggle(position);
}

//定义一个LinearLayout 上下结构 下面的textview可显示可隐藏
private class SpeechView extends LinearLayout {
public SpeechView(Context context, String title, String dialogue, boolean expanded) {
super(context);

this.setOrientation(VERTICAL);

// Here we build the child views in code. They could also have
// been specified in an XML file.

mTitle = new TextView(context);
//mTitle.setTextColor(R.color.title);
mTitle.setTextColor(Color.RED);
mTitle.setTextSize(20);
mTitle.setText(title);
addView(mTitle, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

mDialogue = new TextView(context);
mDialogue.setTextSize(15);
mDialogue.setText(dialogue);
addView(mDialogue, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

mDialogue.setVisibility(expanded ? VISIBLE : GONE);
}

/**
* Convenience method to set the title of a SpeechView
*/
public void setTitle(String title) {
mTitle.setText(title);
}

/**
* Convenience method to set the dialogue of a SpeechView
*/
public void setDialogue(String words) {
mDialogue.setText(words);
}

/**
* Convenience method to expand or hide the dialogue
*/
public void setExpanded(boolean expanded) {
mDialogue.setVisibility(expanded ? VISIBLE : GONE);
}

private TextView mTitle;
private TextView mDialogue;
}

private class SpeechListAdapter extends BaseAdapter {
public SpeechListAdapter(Context context)
{
mContext = context;
}

/**
* The number of items in the list is determined by the number of speeches
* in our array.
*
* @see android.widget.ListAdapter#getCount()
*/
public int getCount() {
return helps.size();
}

/**
* Since the data comes from an array, just returning
* the index is sufficent to get at the data. If we
* were using a more complex data structure, we
* would return whatever object represents one
* row in the list.
*
* @see android.widget.ListAdapter#getItem(int)
*/
public Object getItem(int position) {
return position;
}

/**
* Use the array index as a unique id.
* @see android.widget.ListAdapter#getItemId(int)
*/
public long getItemId(int position) {
return position;
}

/**
* Make a SpeechView to hold each row.
* @see android.widget.ListAdapter#getView(int, android.view.View, android.view.ViewGroup)
*/
public View getView(int position, View convertView, ViewGroup parent) {
Help help = helps.get(position);
String name = help.getName();
String desc = help.getDescr();
SpeechView sv;
if (convertView == null) {
sv = new SpeechView(mContext, name, desc, mExpanded[position]);
} else {
sv = (SpeechView)convertView;
sv.setTitle(name);
sv.setDialogue(desc);
sv.setExpanded(mExpanded[position]);
}

return sv;
}

public void toggle(int position) {
mExpanded[position] = !mExpanded[position];
notifyDataSetChanged();
}

/**
* Remember our context so we can use it when constructing views.
*/
private Context mContext;

}

}
小白
小白
1776
编辑于 2011-08-31
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (2)链接 • 2011-08-31
  • 0 支持
    老陈来点入门级的 嘿嘿 – 小白 2011-08-31
  • 0 支持
    思路大概就是这样子了.正解 – keng 2012-08-09

这个我做过。
可以这样实现,以下是思路:
在这个listview的相应adapter上的getview函数做功夫。
在需要适配的数组上additem作为一个标记,不同与其他的,例如设置成为标记字符串 popmenu,然后再在getView方法做判断,如符合标记,那么就在把原来插入的view替换会这个新的view(你要弹出的view)。

ldmsoft
编辑于 2012-09-13
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-09-13
德问是一个专业的编程问答社区,请 登录注册 后再提交答案