在实际项目中,许多地方都会用到类似ExpandableListView的效果,但是实际使用ExpandableListView的时候比较复杂,而且这个控件展开的时候会改变它的下标。比如: 点击展开第二项的子item时,子item的第一个下标为2,这样计算点击事件就比较复杂。 所以我想了思路比较的简单的,比较容易实现的方法。
大概思路是这样的:在布局中使用一个button加一个listview作为一个整体,设置listview为隐藏。然后点击button就设置listview可见,这样就基本实现ExpandableListView的功能。 只是这个方法比较笨,代码冗余比较多,还请多多包涵。
效果如下
package com.example.exapmples;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.Transformation;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity implements View.OnClickListener{
private ListView listView1,listView2,listView3;
private ImageView img1,img2,img3;
private TextView textview1 ,textview2,textview3;
private RelativeLayout relative1,relative2,relative3;
private List<String> list=new ArrayList<String>();
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
listView1= (ListView) findViewById(R.id.list1);
listView2= (ListView) findViewById(R.id.list2);
listView3= (ListView) findViewById(R.id.list3);
img1= (ImageView) findViewById(R.id.img1);
img2= (ImageView) findViewById(R.id.img2);
img3= (ImageView) findViewById(R.id.img3);
textview1= (TextView) findViewById(R.id.textview1);
textview2= (TextView) findViewById(R.id.textview2);
textview3= (TextView) findViewById(R.id.textview3);
relative1= (RelativeLayout) findViewById(R.id.relative1);
relative2= (RelativeLayout) findViewById(R.id.relative2);
relative3= (RelativeLayout) findViewById(R.id.relative3);
relative1.setOnClickListener(this);
relative2.setOnClickListener(this);
relative3.setOnClickListener(this);
for (int i =0 ; i < 5 ; i++){
list.add("item"+i);
}
adapter =new MyAdapter(this,list);
listView1.setAdapter(adapter);
listView2.setAdapter(adapter);
listView3.setAdapter(adapter);
listView1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
click1(parent,view ,position);
}
});
listView2.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
click2(parent,view ,position);
}
});
listView3.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
click3(parent,view ,position);
}
});
}
private int clickposition1 =-1 ,clickposition2 =-1,clickposition3 =-1;
private void click1(AdapterView<?> parent, View view, int position){
RadioButton rb = (RadioButton) view.findViewById(R.id.rd);
if (rb != null) {
rb.startAnimation(AnimationUtils.loadAnimation(MainActivity.this, R.anim.enlarge_out));
if (clickposition1 == position){
if (rb.isChecked()){
rb.setChecked(false);
Toast.makeText(this,"取消第"+position+"项",Toast.LENGTH_SHORT).show();
} else{
rb.setChecked(true);
Toast.makeText(this,"选中第"+position+"项",Toast.LENGTH_SHORT).show();
}
}
else{
clickposition1 = position;
//这个相当于listview中checkbox的单选,还比较方便
rb.setChecked(true);
Toast.makeText(this,"选中第"+position+"项",Toast.LENGTH_SHORT).show();
for (int i = 0; i < parent.getChildCount(); i++) {
if (i != position) {
View v = parent.getChildAt(i);
if (v != view) {
RadioButton iv2 = (RadioButton) v
.findViewById(R.id.rd);
iv2.startAnimation(AnimationUtils.loadAnimation(MainActivity.this, R.anim.small_out));
iv2.setChecked(false);
}else{