gpt4 book ai didi

带有复选框的Android ExpandableListView,控制选中状态

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:00:59 25 4
gpt4 key购买 nike

friend ,

我正在尝试编写一个在 ExpandableListView 中使用复选框的应用程序,我在这里遇到了一个问题,即维护应用程序的复选框状态,我从 here 得到了示例,我的问题是保持复选框的选中状态,每当我选中其中一个复选框并展开列表时,复选框在它们应该具有的位置没有选中状态。我尝试通过添加 ArrayList 来存储商店的位置并在 getChildView() 中重新加载该位置来进行维护,但仍然没有实现我想做的事情。这是我的代码

public class ElistCBox extends ExpandableListActivity {

private static final String LOG_TAG = "ElistCBox";
ArrayList<String > chkState = new ArrayList<String>();
static final String colors[] = {"grey","blue","yellow","red"};
static final String shades[][] ={ { "lightgrey","#D3D3D3","dimgray","#696969", "sgi >gray 92","#EAEAEA"},
{ "dodgerblue 2","#1C86EE","steelblue >2","#5CACEE","powderblue","#B0E0E6"},
{ "yellow 1","#FFFF00", "gold 1","#FFD700","darkgoldenrod 1"," #FFB90F" },
{"indianred 1","#FF6A6A", "firebrick 1","#FF3030", "maroon","#800000" } };

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
setContentView(R.layout.main);
SimpleExpandableListAdapter expListAdapter = new SimpleExpandableListAdapter(
this,
createGroupList(),
R.layout.group_row, new String[] { "colorName" },
new int[] { R.id.childname }, createChildList(),
R.layout.child_row,
new String[] { "shadeName", "rgb" },
new int[] { R.id.childname, R.id.rgb }
) {
@Override public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent)
{
final View v = super.getChildView(groupPosition, childPosition, isLastChild, convertView, parent);

final CheckBox chkColor = (CheckBox)v.findViewById(R.id.check1);

if(chkState.contains(groupPosition+","+childPosition)){
chkColor.setChecked(true);
}else{
chkColor.setChecked(false);
}
chkColor.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.e("Checkbox Onclick Listener", Integer.toString(groupPosition) + " - " + Integer.toString(childPosition));
}
});
chkColor.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Log.e("Checkbox check change Listener", Integer.toString(groupPosition) + " - " + Integer.toString(childPosition));
if(chkColor.isChecked()){
chkState.add(groupPosition+","+childPosition);
} else {
chkState.remove(groupPosition+","+childPosition);
}
}
});
return super.getChildView(groupPosition, childPosition, isLastChild, convertView, parent);
}
};
setListAdapter( expListAdapter );
}

public void onContentChanged () {
super.onContentChanged();
Log.e( LOG_TAG, "onContentChanged" );
}

public boolean onChildClick(
ExpandableListView parent,
View v,
int groupPosition,
int childPosition,
long id) {
Log.e( LOG_TAG, "onChildClick: "+childPosition );
CheckBox cb = (CheckBox)v.findViewById( R.id.check1 );
if( cb != null )
cb.toggle();
return false;
}

public void onGroupExpand (int groupPosition) {
Log.e( LOG_TAG,"onGroupExpand: "+groupPosition );
}

private List createGroupList() {
ArrayList result = new ArrayList();
for( int i = 0 ; i < colors.length ; ++i ) {
HashMap m = new HashMap();
m.put( "colorName",colors[i] );
result.add( m );
}
return (List)result;
}

private List createChildList() {
ArrayList result = new ArrayList();
for( int i = 0 ; i < shades.length ; ++i ) {
ArrayList secList = new ArrayList();
for( int n = 0 ; n < shades[i].length; n += 2 ) {
HashMap child = new HashMap();
child.put( "shadeName", shades[i][n] );
child.put( "rgb", shades[i][n+1] ); secList.add( child );
}
result.add( secList );
}
return result;
}
}

最佳答案

这是我对这个问题的回答,你需要为单个 child 保持检查状态,并在点击 child 时检查它。经过一些研究,这是由于 android 的 View 生命周期导致 View 刷新,从而无法保持状态。

public class MyExpandableListAdapter extends BaseExpandableListAdapter {
//Variables
// Sample data set. children[i] contains the children (String[]) for groups[i].
private String[] groups = { "People Names", "Dog Names", "Cat Names", "Fish Names" }; //headers
private String[][] children = {
{ "Arnold", "Barry", "Chuck", "David" },
{ "Ace", "Bandit", "Cha-Cha", "Deuce" },
{ "Fluffy", "Snuggles" },
{ "Goldy", "Bubbles" }
};
private String[] group_vaues = {"PN", "DN", "CN", "FN"};
private String[][] children_values = {
{ "Ar", "Ba", "Ch", "Da" },
{ "Ace", "Ban", "Cha", "Deu" },
{ "Flu", "Snu" },
{ "Gol", "Bub" }
};
ArrayList<ArrayList<Integer>> check_states = new ArrayList<ArrayList<Integer>>();

private Context context;

//Constructors
public MyExpandableListAdapter() {

}

public MyExpandableListAdapter(Context c) {
this.context = c;
}

//Set Methods
public void setGroupsAndValues(String[] g, String[] v) {
this.groups = g;
this.group_vaues = v;
}

public void setChildrenAndValues(String[][] c, String[][] v) {
this.children = c;
this.children_values = v;
//initialize the states to all 0;
for(int i = 0; i < c.length; i++) {
ArrayList<Integer> tmp = new ArrayList<Integer>();
for(int j = 0; j < c[i].length; j++) {
tmp.add(0);
}
check_states.add(tmp);
}
}

//Get Methods
public Object getChild(int groupPosition, int childPosition) {
return children[groupPosition][childPosition];
}

public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}

public int getChildrenCount(int groupPosition) {
return children[groupPosition].length;
}

public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
View convertView, ViewGroup parent) {
View grid;


LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
grid = inflater.inflate(R.layout.specialty_list_item, parent, false);

final int grpPos = groupPosition;
final int childPos = childPosition;

TextView header = (TextView)grid.findViewById(R.id.title);
header.setText(getChild(groupPosition, childPosition).toString());
final View tick = grid.findViewById(R.id.image);
if(check_states.get(grpPos).get(childPos) == 1)
tick.setVisibility(View.VISIBLE);
else
tick.setVisibility(View.GONE);

grid.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
check_states.get(grpPos).set(childPos, 1);
tick.setVisibility(View.VISIBLE);
}
});

return grid;
}

public Object getGroup(int groupPosition) {
return groups[groupPosition];
}

public int getGroupCount() {
return groups.length;
}

public long getGroupId(int groupPosition) {
return groupPosition;
}

public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
ViewGroup parent) {
View grid;

if(convertView==null){
grid = new View(context);
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
grid = inflater.inflate(R.layout.specialty_header, parent, false);
}else{
grid = (View)convertView;
}

TextView header = (TextView)grid.findViewById(R.id.specialty_header);
header.setText(getGroup(groupPosition).toString());


return grid;
}

public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}

public boolean hasStableIds() {
return true;
}

关于带有复选框的Android ExpandableListView,控制选中状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5068668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com