gpt4 book ai didi

java - 可扩展 ListView 中不同组的不同布局

转载 作者:太空狗 更新时间:2023-10-29 13:35:37 26 4
gpt4 key购买 nike

我需要在我的应用程序中使用可扩展的 ListView ,其中每个组都有不同的表格布局。我想为表格中的每一行设置 onClick 监听器。

How is it possible to set different layouts to different groups in a expandable listview?

Or Is it possible to do the same function of Expandable listview with Table Layout by dynamically adding rows(expanding) and removing them (hiding).

最佳答案

您可以基于例如 BaseExpandableListAdapter 创建自己的 ExpandableListAdapter。接下来,您应该覆盖 getChildView 方法,以便所需的 subview 具有所需的布局。这是一个简短的例子:

public class MyExpandableListAdapter extends BaseExpandableListAdapter {
public ArrayList<String> groupItem;
public ArrayList<Object> childItem;
public LayoutInflater minflater;

public MyExpandableListAdapter(ArrayList<String> grList,
ArrayList<Object> childItem, Context context) {
groupItem = grList;
this.childItem = childItem;
this.context = context;
minflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public View getChildView(int groupPosition, final int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {

if (convertView == null) {
if (groupItem.get(groupPosition).equals("desired_group_name")) {
convertView = minflater.inflate(R.layout.desired_layout, null);
} else {
convertView = minflater.inflate(R.layout.other_layout, null);
}
}
}
}

如果这个答案不清楚,我可以为您提供整个类(class),但示例很容易在网上找到。

这是我项目中的整个类(class)。我知道 convertView 应该是可重用的,但是当列表折叠然后重新打开时,我对 Views 的顺序有疑问。我只有几个元素,所以从性能角度来看这不是问题。

package pl.psnc.iip.hne.android.hneclient.adapter;
import java.util.ArrayList;
import pl.psnc.iip.hne.android.hneclient.R;
import pl.psnc.iip.hne.android.hneclient.json.Device;
import pl.psnc.iip.hne.android.hneclient.json.Devices;
import pl.psnc.iip.hne.android.hneclient.listeners.ImageViewRegisteredListener;
import pl.psnc.iip.hne.android.hneclient.utility.ConnectionUtils;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckedTextView;
import android.widget.ImageView;
import android.widget.TextView;

public class DeviceExpandableListAdapter extends BaseExpandableListAdapter {

public ArrayList<String> groupItem;
public ArrayList<Device> tempChild;
public ArrayList<Object> childItem;
public LayoutInflater minflater;

ArrayList<ImageViewRegisteredListener> ivrListeners = null;
public Activity activity;
public Context context;
int idIterator;

public void addImageViewRegisteredListener(
ImageViewRegisteredListener listener) {
if (!ivrListeners.contains(listener)) {
ivrListeners.add(listener);
}
}

public void removeImageViewRegisteredListener(
ImageViewRegisteredListener listener) {
if (ivrListeners.contains(listener)) {
ivrListeners.remove(listener);
}
}

public DeviceExpandableListAdapter(ArrayList<String> grList,
ArrayList<Object> childItem, Context context) {
groupItem = grList;
idIterator = 0;
ivrListeners = new ArrayList<ImageViewRegisteredListener>();
this.childItem = childItem;
this.context = context;

minflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

public void setInflater(LayoutInflater mInflater, Activity act) {
this.minflater = mInflater;
activity = act;
}

public int findAppropriateImageForDevice(String type) {
int id = -1;
if (type.equals(Devices.PLOGG)) {
id = R.drawable.plogg;
} else if (type.equals(Devices.RFID)) {
id = R.drawable.rfid;
} else if (type.equals(Devices.BARRIER)) {
// id = -1;
} else if (type.equals(Devices.TEMPLIGHT)) {
// id = -1;
}
return id;
}

@Override
public Object getChild(int groupPosition, int childPosition) {
return (Device) ((ArrayList<Device>) childItem.get(groupPosition))
.get(childPosition);
}

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

@Override
public View getChildView(int groupPosition, final int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
tempChild = (ArrayList<Device>) childItem.get(groupPosition);
Device device = tempChild.get(childPosition);
Log.i(this.getClass().getName(), device.getIp());
if (groupItem.get(groupPosition).equals(Devices.PLOGG)) {
int newId = -1;
Integer oldId = ConnectionUtils.getInstance().getPowerIndicatorHT()
.get(device.getIp());
if (oldId != null) {
newId = oldId;
} else {
++idIterator;
newId = idIterator;
ConnectionUtils.getInstance().getPowerIndicatorHT()
.put(device.getIp(), newId);
}
convertView = minflater.inflate(R.layout.plogg_item, null);
ImageView powerIndicator = (ImageView) convertView
.findViewById(R.id.powerIndicator);

powerIndicator.setId(newId);

Integer foundId = ConnectionUtils.getInstance()
.getPowerIndicatorHT().get(device.getIp());
if (foundId != null) {
for (ImageViewRegisteredListener listener : ivrListeners) {
listener.imageViewRegistered(convertView, foundId,
device.getIp());
}
}

Log.i(DeviceExpandableListAdapter.class.getName(), "newId: "
+ newId);

} else {
convertView = minflater.inflate(R.layout.device_item, null);
}
TextView textTop = null;
textTop = (TextView) convertView.findViewById(R.id.toptext);
TextView textBottom = null;
textBottom = (TextView) convertView.findViewById(R.id.bottomtext);

textTop.setText(device.getIp());
textBottom.setText(device.getDescription());

int id = findAppropriateImageForDevice(device.getType());
ImageView image = (ImageView) convertView.findViewById(R.id.icon);
if (id != -1) {
image.setImageResource(id);
} else {
image.setImageResource(R.drawable.ic_launcher);
}

return convertView;
}

@Override
public int getChildrenCount(int groupPosition) {
return ((ArrayList<String>) childItem.get(groupPosition)).size();
}

@Override
public Object getGroup(int groupPosition) {
return null;
}

@Override
public int getGroupCount() {
return groupItem.size();
}

@Override
public void onGroupCollapsed(int groupPosition) {
super.onGroupCollapsed(groupPosition);
}

@Override
public void onGroupExpanded(int groupPosition) {
super.onGroupExpanded(groupPosition);
}

@Override
public long getGroupId(int groupPosition) {
return 0;
}

@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = minflater.inflate(R.layout.group_row, null);
}
CheckedTextView ctv = (CheckedTextView) convertView
.findViewById(R.id.textView1);
ctv.setText(groupItem.get(groupPosition));
ctv.setChecked(isExpanded);
return convertView;
}

@Override
public boolean hasStableIds() {
return false;
}

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

}

实际情况如下:

The view of ExpandableListAdapter

关于java - 可扩展 ListView 中不同组的不同布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10990711/

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