ExpandableListView getChildAt()返回null [英] ExpandableListView getChildAt() return null
问题描述
我想将图像添加到ExpandableList的某些单元格中我已经在寻找问题的答案,然后尝试放入
I want to add an image into some cells in ExpandableListI already search for answer on my question and I try to put
expListView.getLastVisiblePosition();
expListView.getFirstVisiblePosition();
这是行不通的.我无法在适配器的getView()中执行此操作,因为我是通过从数据库下载数据来动态创建单元格的,然后可以说出哪个单元格需要图像.
And it isn't work. I can't do this in getView() in adapter, because I create cells dynamically by downloading data from database, and after it I can say which cell need image.
我也尝试这样做: 有时listView.getChildAt(int index)返回NULL(Android) getChildAt上的Nullpointerexception GridView getChildAt()返回null 没有解决方案. 这是我的代码:
I also tried to do: Sometimes listView.getChildAt(int index) returns NULL (Android) Nullpointerexception on getChildAt GridView getChildAt() returns null No solution work. It is my code:
public class ExpandableListAdapter extends BaseExpandableListAdapter {
private Context _context;
private List<String> _listDataHeader; // header titles
// child data in format of header title, child title
private HashMap<String,String> _listDataChild;
public ExpandableListAdapter(Context context, List<String> listDataHeader,
HashMap<String, String> listChildData) {
this._context = context;
this._listDataHeader = listDataHeader;
this._listDataChild = listChildData;
}
@Override
public Object getChild(int groupPosition, int childPosititon) {
return this._listDataChild.get(this._listDataHeader.get(groupPosition));
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public View getChildView(int groupPosition, final int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
final String childText = (String) getChild(groupPosition, childPosition);
if (convertView == null) {
LayoutInflater infalInflater = (LayoutInflater) this._context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.list_item, null);
}
TextView txtListChild = (TextView) convertView
.findViewById(R.id.lblListItem);
txtListChild.setText(childText);
return convertView;
}
@Override
public int getChildrenCount(int groupPosition) {
return 1;
}
@Override
public Object getGroup(int groupPosition) {
return this._listDataHeader.get(groupPosition);
}
@Override
public int getGroupCount() {
return this._listDataHeader.size();
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
String headerTitle = (String) getGroup(groupPosition);
if (convertView == null) {
LayoutInflater infalInflater = (LayoutInflater) this._context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.spinner, null);
}
TextView lblListHeader = (TextView) convertView
.findViewById(R.id.lblListHeader);
lblListHeader.setTypeface(Controller.getInstance().getTypeface());
lblListHeader.setText(headerTitle);
//I can' do this in this place
//ImageView iv = (ImageView)convertView.findViewById(R.id.exc);
//iv.setImageResource(R.drawable.excl);
return convertView;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
活动:
public class ExpertZone extends Activity{
String err;
Context context;
ExpandableListAdapter listAdapter;
ExpandableListView expListView;
List<String> listDataHeader;
HashMap<String, String> listDataChild;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.expert_zone);
context=this;
// get the listview
expListView = (ExpandableListView) findViewById(R.id.expListView);
// preparing list data
prepareListData();
}
/*
* Preparing the list data
*/
private void prepareListData() {
listDataHeader = new ArrayList<String>();
listDataChild = new HashMap<String, String>();
DBexpertTask dbTask = new DBexpertTask(getString(R.string.expertServlet)) {
@Override
protected void onPostExecute(JSONObject obj) {
JSONArray jArray = new JSONArray();
try {
JSONArray jsonObject = obj.getJSONArray(getString(R.string.data));
for (int i = 0; i < jsonObject.length(); i++) {
JSONObject object = jsonObject.getJSONObject(i);
err = object.getString(getString(R.string.err));
if(err.equals(getString(R.string.no))) {
jArray = object.getJSONArray(getString(R.string.data));
for (int j = 0; j < jArray.length(); j++) {
JSONObject values = jArray.getJSONObject(j);
listDataHeader.add(String.valueOf(values.get(getString(R.string.who)).toString()));
listDataChild.put(String.valueOf(values.get(getString(R.string.who)).toString()), String.valueOf(values.get(getString(R.string.what)).toString()));
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
listAdapter = new ExpandableListAdapter(context, listDataHeader, listDataChild);
// setting list adapter
expListView.setAdapter(listAdapter);
for(int j=0; j<expListView.getCount(); j++){
expListView.getLastVisiblePosition();
expListView.getFirstVisiblePosition();
View v = expListView.getChildAt(j).findViewById(R.id.expListView);
ImageView iv = (ImageView) v.findViewById(R.id.exc);
iv.setImageResource(R.drawable.excl);
}
}
};
dbTask.execute();
}
}
我的xml-单元格布局
my xml - cell layout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="6">
<TextView
android:id="@+id/lblListHeader"
android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"
android:gravity="center_vertical|center_horizontal"
android:layout_weight="5"
android:layout_width="0dp"
android:layout_height="60dp"
android:textSize="18dp" />
<ImageView
android:id="@+id/exc"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center_vertical|center_horizontal"
android:layout_gravity="center_vertical" />
</LinearLayout>
和expert_zone.xml
and expert_zone.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_alignParentBottom="true"
>
<ExpandableListView
android:id="@+id/expListView"
android:layout_height="match_parent"
android:layout_width="match_parent"/>
</LinearLayout>
如何在此适配器中动态更改图像图标? 建议得到高度赞赏.
How can I dynamically change image icon in this adapter? Suggestions are highly appreciated.
推荐答案
如果该子项当前不可见,则该视图可能为空,因为该子视图已被回收,如果需要访问数据,则应该获取适配器,然后获取该对象从中.请检查以下答案:
If the child is currently not visible the view might be null since it was recycled, if you need to access data you should get the Adapter instead and fetch the object from it. Please check this answer:
这篇关于ExpandableListView getChildAt()返回null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!