您的位置:首页 > 移动开发 > Android开发

Android ListView控件选中item项,并保持选中状态

2016-04-16 16:31 495 查看
这几天在做公司的项目,有这样一个需求,就是在listView里,点击item子项的时候需要保持item子项的选中状态,上网搜了一些资料,最后也实现了。现在就记录下来,一方面方便以后自己回顾好复习温故,另外也和大家分享。

不多说了,上代码。先贴xml布局文件的。
main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/portalLinearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<RelativeLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="2"
android:background="#cccccc"
android:orientation="vertical" >
<ListView
android:id="@+id/testModuleListView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_marginTop="100dp" />
</LinearLayout>

item_module.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/portalLinearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >

<TextView
android:id="@+id/itemName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center"
android:textSize="24px" />

</LinearLayout>

xml文件如果有问题的话就需要各位自己去稍微调整调整了。参考了网上的一些资料,都有自定义一个适配器,这里我自己也写了一个adapter。

public class CustomListViewAdapter extends BaseAdapter {

private Context context;
private List<Map<String, Object>> list;
private int selectItem = -1;

public CustomListViewAdapter(Context context, List<Map<String, Object>> maps) {
this.context = context;
this.list = maps;
}

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

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

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

public void setSelectItem(int selectItem) {
this.selectItem = selectItem;
}

@SuppressLint("ResourceAsColor")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder viewHolder = null;
if (convertView == null && list.size() != 0) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.item_module, null);
viewHolder.itemTextView = (TextView) convertView.findViewById(R.id.itemName);
viewHolder.portalLinearLayout = (LinearLayout) convertView.findViewById(R.id.portalLinearLayout);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();

}
viewHolder.itemTextView.setText(list.get(position).get("itemName").toString());
if (selectItem == position) {
viewHolder.itemTextView.setSelected(true);
viewHolder.itemTextView.setPressed(true);
viewHolder.portalLinearLayout.setBackgroundColor(Color.YELLOW);
} else {
viewHolder.itemTextView.setSelected(false);
viewHolder.itemTextView.setPressed(false);
viewHolder.portalLinearLayout.setBackgroundColor(Color.TRANSPARENT);
}
return convertView;
}

private class ViewHolder {
private TextView itemTextView;
private LinearLayout portalLinearLayout;
}

}


这里有几点了,在getView()方法里可以看到,如果选中的项和适配器里的position相等的话,就改变item的背景色,但是在改变之前,要把TextView的的两项属性设置一下。
接下来就是activity了

public class PortalActivity extends FragmentActivity {
private ListView testModuleListView;
CustomListViewAdapter adapter;

private String[][] itemStrings = new String[][] {
{ "1.xxxx", Ket },
{ "2.xxxx", Ke },
{ "3.xxxx", Keest },
{ "4.xxxxx", Kt },
{ "5.xxxxx", Kt }, { "6.xxxxx", Kst },
{ "7.xxxxx", x },
{ "8.xxxx", x },
{ "9.xxxxx", t },
{ "10.xxxxx", t },
{ "11.xxxx", t },
{ "12.x", t } };

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
bindViews();
initListView();
bindEvents();
}

private void bindEvents() {
testModuleListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Log.i("test", "点击了:" + position);
Map<String, Object> appItem = (Map<String, Object>) parent
.getItemAtPosition(position);
adapter.setSelectItem(position);
adapter.notifyDataSetInvalidated();
}
});

private List<Map<String, Object>> initialModuleItem() {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map;
for (int i = 0; i < itemStrings.length; i++) {
map = new HashMap<String, Object>();
map.put("itemName", itemStrings[i][0]);
map.put("action", itemStrings[i][1]);
list.add(map);
}

return list;

}

private void bindViews() {
testModuleListView = (ListView) findViewById(R.id.testModuleListView);
}

private void initListView() {
List<Map<String, Object>> maps = initialModuleItem();
adapter = new CustomListViewAdapter(this, maps);
testModuleListView.setAdapter(adapter);
}

}
这样以后就能实现了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: