1. android打造任意層級的樹形控制項那個id能不能用string
由於整體比較長,我決定首先帶大家看一下用法,就是如果學完了這篇博客,我們需要樹形控制項,我們需要花多少精力去完成~~
現在需求來了:我現在需要展示一個文件管理系統的樹形結構:
數據是這樣的:
//id , pid , label , 其他屬性
mDatas.add(new FileBean(1, 0, "文件管理系統"));
mDatas.add(new FileBean(2, 1, "游戲"));
mDatas.add(new FileBean(3, 1, "文檔"));
mDatas.add(new FileBean(4, 1, "程序"));
mDatas.add(new FileBean(5, 2, "war3"));
mDatas.add(new FileBean(6, 2, "刀塔傳奇"));
mDatas.add(new FileBean(7, 4, "面向對象"));
mDatas.add(new FileBean(8, 4, "非面向對象"));
mDatas.add(new FileBean(9, 7, "C++"));
mDatas.add(new FileBean(10, 7, "java"));
mDatas.add(new FileBean(11, 7, "Javascript"));
mDatas.add(new FileBean(12, 8, "C"));
當然了,bean可以有很多屬性,我們提供你動態的設置樹節點上的顯示、以及不約束id, pid 的命名,你可以起任意喪心病狂的屬性名稱;
那麼我們如何確定呢?
看下Bean:
package com.zhy.bean;
import com.zhy.tree.bean.TreeNodeId;
import com.zhy.tree.bean.TreeNodeLabel;
import com.zhy.tree.bean.TreeNodePid;
public class FileBean
{
@TreeNodeId
private int _id;
@TreeNodePid
private int parentId;
@TreeNodeLabel
private String name;
private long length;
private String desc;
public FileBean(int _id, int parentId, String name)
{
super();
this._id = _id;
this.parentId = parentId;
this.name = name;
}
}
現在,不用說,應該也知道我們通過註解來確定的。
下面看我們如何將這數據轉化為樹
布局文件就一個listview,就補貼了,直接看Activity
package com.zhy.tree_view;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import com.zhy.bean.FileBean;
import com.zhy.tree.bean.TreeListViewAdapter;
public class MainActivity extends Activity
{
private List<FileBean> mDatas = new ArrayList<FileBean>();
private ListView mTree;
private TreeListViewAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initDatas();
mTree = (ListView) findViewById(R.id.id_tree);
try
{
mAdapter = new SimpleTreeAdapter<FileBean>(mTree, this, mDatas, 10);
mTree.setAdapter(mAdapter);
} catch (IllegalAccessException e)
{
e.printStackTrace();
}
}
private void initDatas()
{
// id , pid , label , 其他屬性
mDatas.add(new FileBean(1, 0, "文件管理系統"));
mDatas.add(new FileBean(2, 1, "游戲"));
mDatas.add(new FileBean(3, 1, "文檔"));
mDatas.add(new FileBean(4, 1, "程序"));
mDatas.add(new FileBean(5, 2, "war3"));
mDatas.add(new FileBean(6, 2, "刀塔傳奇"));
mDatas.add(new FileBean(7, 4, "面向對象"));
mDatas.add(new FileBean(8, 4, "非面向對象"));
mDatas.add(new FileBean(9, 7, "C++"));
mDatas.add(new FileBean(10, 7, "JAVA"));
mDatas.add(new FileBean(11, 7, "Javascript"));
mDatas.add(new FileBean(12, 8, "C"));
}
}
Activity裡面並沒有什麼特殊的代碼,拿到listview,傳入mData,當中初始化了一個Adapter;
看來我們的核心代碼都在我們的Adapter裡面:
那麼看一眼我們的Adapter
package com.zhy.tree_view;
import java.util.List;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.zhy.tree.bean.Node;
import com.zhy.tree.bean.TreeListViewAdapter;
public class SimpleTreeAdapter<T> extends TreeListViewAdapter<T>
{
public SimpleTreeAdapter(ListView mTree, Context context, List<T> datas,
int defaultExpandLevel) throws IllegalArgumentException,
IllegalAccessException
{
super(mTree, context, datas, defaultExpandLevel);
}
@Override
public View getConvertView(Node node , int position, View convertView, ViewGroup parent)
{
ViewHolder viewHolder = null;
if (convertView == null)
{
convertView = mInflater.inflate(R.layout.list_item, parent, false);
viewHolder = new ViewHolder();
viewHolder.icon = (ImageView) convertView
.findViewById(R.id.id_treenode_icon);
viewHolder.label = (TextView) convertView
.findViewById(R.id.id_treenode_label);
convertView.setTag(viewHolder);
} else
{
viewHolder = (ViewHolder) convertView.getTag();
}
if (node.getIcon() == -1)
{
viewHolder.icon.setVisibility(View.INVISIBLE);
} else
{
viewHolder.icon.setVisibility(View.VISIBLE);
viewHolder.icon.setImageResource(node.getIcon());
}
viewHolder.label.setText(node.getName());
return convertView;
}
private final class ViewHolder
{
ImageView icon;
TextView label;
}
}
我們的SimpleTreeAdapter繼承了我們的TreeListViewAdapter ; 除此之外,代碼上只需要復寫getConvertView , 且getConvetView其實和我們平時的getView寫法一致;
公布出getConvertView 的目的是,讓用戶自己去決定Item的展示效果。其他的代碼,我已經打包成jar了,用的時候導入即可。這樣就完成了我們的樹形控制項。
也就是說用我們的樹形控制項,只需要將傳統繼承BaseAdapter改為我們的TreeListViewAdapter ,然後去實現getConvertView 就好了。
2. 如何通過ListView實現多選效果
一.無圖無真相
二.關鍵代碼
1.主布局 sample_main.xml(單選和多選切換,設置android:choiceMode,其他不變)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:showDividers="middle"
android:divider="?android:dividerHorizontal">
<TextView style="@style/Widget.DescriptionBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/intro_message" />
<!--
當 ListView 已設置 choiceMode 時,它將允許用戶"選擇"
一個或多個項目。該框架提供了默認列表項目布局,這顯示標准單選按鈕或復選框旁邊
單行文本:
《 android:choiceMode="singleChoice"》
R.layout.simple_list_item_single_choice 和
《 android:choiceMode="multipleChoice"》
R.layout.simple_list_item_multiple_choice。
應該設置 android: scrollbarStyle (顯示和隱藏)
android:scrollbarStyle="outsideInset"不顯示
android:scrollbarStyle="insideOverlay"顯示
-->
<ListView android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:paddingLeft="@dimen/page_margin"
android:paddingRight="@dimen/page_margin"
android:scrollbarStyle="outsideInset"
android:choiceMode="multipleChoice" /></LinearLayout>
2.item布局
<!--
從 sample_main.xml ListView 有 choiceMode 套,意思說當用戶
選擇列表項,列表視圖將設置為該項目的根視圖狀態
(此 CheckableLinearLayout)"檢查"。請注意,這需要查看
實現的介面。一旦選中根視圖,則任何item,
有 plicateParentState 屬性設置的將繼承此"選中"狀態.
--><com.example.android.customchoicelist.CheckableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="8dp"
android:id="@+id/ll_contain"
android:paddingRight="8dp"
android:minHeight="?android:listPreferredItemHeight"
android:gravity="center_vertical">
<TextView android:id="@android:id/text1"
android:plicateParentState="true"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:textAppearance="?android:textAppearanceMedium"
android:textColor="@color/hideable_text_color" />
<ImageView android:src="@drawable/ic_hideable_item"
android:plicateParentState="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp" /></com.example.android.customchoicelist.CheckableLinearLayout>34
3.自定義單選和多選布局
package com.example.android.customchoicelist;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.View;import android.widget.Checkable;import android.widget.LinearLayout;/**
*自定義單選和多選布局
*/public class CheckableLinearLayout extends LinearLayout implements Checkable {
private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked}; private boolean mChecked = false; public CheckableLinearLayout(Context context, AttributeSet attrs) { super(context, attrs);
} //返回選中的狀態
public boolean isChecked() { return mChecked;
} //設置選中的狀態
public void setChecked(boolean b) { if (b != mChecked) {
mChecked = b;
refreshDrawableState();
}
} //選擇開關
public void toggle() {
setChecked(!mChecked);
} //添加選中的條目狀態
@Override
public int[] onCreateDrawableState(int extraSpace) { final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); if (isChecked()) {
mergeDrawableStates(drawableState, CHECKED_STATE_SET);
} return drawableState;
}
}343536373839404142434445
4.主要代碼MainActivity.java
package com.example.android.customchoicelist;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;/**
*如何創建自定義的單或多選擇
* @author 孤狼
* @since 2015-8-3
*/public class MainActivity extends Activity {
ListView listView; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.sample_main);
listView =(ListView)findViewById(R.id.listview);
listView.setAdapter(new MyAdapter());
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //獲取條目
CheckableLinearLayout linearLayout = (CheckableLinearLayout) view.findViewById(R.id.ll_contain); if (linearLayout.isChecked()) {
Log.e("選中true", position + "");
} else {
Log.e("未選中false", position + "");
} /**對於多選,建議創建集合,用於封裝用戶選中的條目position,存入時判定 用戶來回切換的狀態*/
}
});
} /**
* A simple array adapter that creates a list of cheeses.
*/
private class MyAdapter extends BaseAdapter {
@Override
public int getCount() { return Cheeses.CHEESES.length;
} @Override
public String getItem(int position) { return Cheeses.CHEESES[position];
} @Override
public long getItemId(int position) { return Cheeses.CHEESES[position].hashCode();
} @Override
public View getView(int position, View convertView, ViewGroup container) { if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.list_item, container, false);
}
((TextView) convertView.findViewById(android.R.id.text1))
.setText(getItem(position)); return convertView;
}
}
}3435363738394
三.說明
通篇沒有多餘的廢話,不浪費大家的寶貴時間,代碼簡潔,主要部分都有注釋,實際開發中的需求,需要牛牛們自己自定義,發揮,如有疑問,請留言—-孤狼
四.示例源碼(由於孤狼使用的是Android studio開發,暫時沒有eclipse版)
3. android系統下有沒有多選和全選文件的功能
安裝RE文件管理器,進入相應文件夾以後按menu鍵,點多選,再點全選就行了
4. android的Listview多選問題!!根據第一個Listview選中的項,傳到另一個Listview中,相同項默認選中!
litview.setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
Message message = new Message();
message.what = 1;
message.arg1 = arg2;
handler.sendMessage(message);
}
public Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
litview.setItemChecked((msg.arg1), true);
break;
}
super.handleMessage(msg);
}
};
onItemClick中的arg2不就是這一項在列表中的位置么?你可以發個消息設置listView。
如果沒有用自定義適配器。要設置另外一個LISTview的話,需要循環一下,第一個列表選擇的項,在第二個列表的位置。再來設置。
不過我建議你還是自定義一個適配器。
5. android.中,使用ListView來呈現一個多選欄、為什麼需要設置:listView.setItemsCanFocus(false);
因為要點擊的多選欄要獲取焦點,否則多選欄會點擊不到。如果不設置的話,焦點會被listview的item獲取。
6. 安卓編程listview里怎樣實現長按出現checkbox實現多選
listview_long_checked_delete_demo:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@+id/listview_long_checked_delete_demo_listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/listview_long_checked_delete_demo_relativelayout1"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >
</ListView>
<RelativeLayout
android:id="@+id/listview_long_checked_delete_demo_relativelayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:visibility="gone"
>
<Button
android:id="@+id/listview_long_checked_delete_demo_button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="40dp"
android:layout_toRightOf="@+id/listview_long_checked_delete_demo_button4"
android:text="@string/listview_long_checked_delete_demo_button3" />
<Button
android:id="@+id/listview_long_checked_delete_demo_button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="20dp"
android:layout_toRightOf="@+id/listview_long_checked_delete_demo_button3"
android:text="@string/listview_long_checked_delete_demo_button2" />
<Button
android:id="@+id/listview_long_checked_delete_demo_button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="22dp"
android:text="@string/listview_long_checked_delete_demo_button1" />
<Button
android:id="@+id/listview_long_checked_delete_demo_button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="22dp"
android:layout_toRightOf="@+id/listview_long_checked_delete_demo_button1"
android:text="@string/listview_long_checked_delete_demo_button4" />
</RelativeLayout>
</RelativeLayout>
7. 如何在Android中展示樹狀結構的數據
取決於你的數據源的設計。通常在關系型資料庫中涉及到樹形顯示的信息,都有一個父分類parentid屬性,根據父分類屬性中的值,我們可以確定該條數據屬於哪個分類,也可以得到某一個分類下的子分類信息。因此可以使用簡單遞歸方法實現遍歷效果://獲取某分類下子分類方法public nodelist getnodesbyparentid(object parentid){.........}//public nodelist getnodes(node paranode){ nodelist returnlist = getnodesbyparentid(paranode.id); for(int nCount = 0; nCount<returnlist.count;nCount ++) { returnlist.add(getnodes.id); } return returnlist;}
8. android listview兩種布局,一種單選一種多選,怎樣獲得選中狀態,並存入資料庫
setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); // 多選
setChoiceMode(ListView.CHOICE_MODE_SINGLE) // 單選
選擇後的效果是要子view支持才可以的。需要checkable的子view才可以,如果你是普通的textview之類的。。可能選中和不選中效果是一樣的。
至於寫入資料庫,android上用sqlite。。。
9. 求助,android用expandablelistview實現三級樹形顯示
三級顯示的方法有很多,自定義listview控制項然後用expandlistview或者直接用view載入expendlistview都行,LZ第三級那裡獲取有什麼問題可以說明白點~用的什麼方法