Java 为什么我的Android ListAdapter只显示一项?
在我的Android应用程序中,我正试图构建我的第一个自定义listadapter。我现在设法让它显示一个项目,但不幸的是,只有在列表中有8个项目的地方才显示一个项目。我的适配器如下所示:Java 为什么我的Android ListAdapter只显示一项?,java,android,listadapter,Java,Android,Listadapter,在我的Android应用程序中,我正试图构建我的第一个自定义listadapter。我现在设法让它显示一个项目,但不幸的是,只有在列表中有8个项目的地方才显示一个项目。我的适配器如下所示: public class PossibilitiesAdapter extends BaseAdapter { private AdapterCallbacks callbacks; private List<String> possibilitiesList = new Arra
public class PossibilitiesAdapter extends BaseAdapter {
private AdapterCallbacks callbacks;
private List<String> possibilitiesList = new ArrayList<String>();
private LayoutInflater inflater;
public PossibilitiesAdapter(Context context) {
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void setPossibilitiesList(List<String> possibilitiesList) {
for (String possibility : possibilitiesList) {
addItem(possibility);
}
}
public void addItem (final String item) {
possibilitiesList.add(item);
notifyDataSetChanged();
}
private class ViewHolder {
TextView possibilityTitle;
}
@Override
public View getView(final int position, View convertView, ViewGroup viewGroup) {
ViewHolder holder = new ViewHolder();
convertView = inflater.inflate(R.layout.list_item_posibility, viewGroup, false);
holder.possibilityTitle = (TextView) convertView.findViewById(R.id.text_possibility);
holder.possibilityTitle.setText(possibilitiesList.get(position));
return convertView;
}
@Override
public int getCount() {
return possibilitiesList.size();
}
// And here are some more things like getItemId() and getItem()
}
public PossibilitiesAdapter(Context context) {
inflater = LayoutInflater.fromContext(context);
}
公共类可能性适配器扩展BaseAdapter{
私有适配器回调回调;
私有列表可能性列表=新的ArrayList();
私人充气机;
公共可能性适配器(上下文){
充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
}
公共无效集合可能性列表(列表可能性列表){
for(字符串可能性:可能性列表){
附加项(可能性);
}
}
公共无效附加项(最终字符串项){
可能性列表。添加(项目);
notifyDataSetChanged();
}
私有类视窗持有者{
文本视图可能性;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组视图组){
ViewHolder=新的ViewHolder();
convertView=充气机。充气(R.layout.list\u item\u posibility,viewGroup,false);
holder.possibilityTitle=(TextView)convertView.findViewById(R.id.text\u可能性);
holder.possibilityTitle.setText(position)(可能列表.get(位置));
返回视图;
}
@凌驾
public int getCount(){
返回可能性列表.size();
}
//这里还有一些东西,比如getItemId()和getItem()
}
我从片段中设置了可能性列表,如下所示:
List<String> list = Arrays.asList(getResources().getStringArray(R.array.the_possibilities));
Log.e(this, new Integer(list.size()).toString()); // Outputs 8, so there are enough in the array.
adapter.setPossibilitiesList(list);
List List=Arrays.asList(getResources().getStringArray(R.array.the_));
Log.e(这是一个新的整数(list.size()).toString());//输出8,因此阵列中有足够的数据。
adapter.setposabilitieslist(列表);
我的fragment_posabilities.xml如下所示:
public class PossibilitiesAdapter extends BaseAdapter {
private AdapterCallbacks callbacks;
private List<String> possibilitiesList = new ArrayList<String>();
private LayoutInflater inflater;
public PossibilitiesAdapter(Context context) {
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void setPossibilitiesList(List<String> possibilitiesList) {
for (String possibility : possibilitiesList) {
addItem(possibility);
}
}
public void addItem (final String item) {
possibilitiesList.add(item);
notifyDataSetChanged();
}
private class ViewHolder {
TextView possibilityTitle;
}
@Override
public View getView(final int position, View convertView, ViewGroup viewGroup) {
ViewHolder holder = new ViewHolder();
convertView = inflater.inflate(R.layout.list_item_posibility, viewGroup, false);
holder.possibilityTitle = (TextView) convertView.findViewById(R.id.text_possibility);
holder.possibilityTitle.setText(possibilitiesList.get(position));
return convertView;
}
@Override
public int getCount() {
return possibilitiesList.size();
}
// And here are some more things like getItemId() and getItem()
}
public PossibilitiesAdapter(Context context) {
inflater = LayoutInflater.fromContext(context);
}
和我的列表_item _probability.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/text_possibility"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
所以问题是,它只显示第一项,而不显示更多内容。有人知道问题是什么以及我如何解决它吗?您的getView方法实现错误,更准确地说是视图持有者模式。 我猜你看到的条目数量合适,但内容都相同 试试这个:
@Override
public View getView(final int position, View convertView, ViewGroup viewGroup) {
ViewHolder holder = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item_posibility, viewGroup, false);
holder = new Holder();
holder.possibilityTitle = (TextView) convertView.findViewById(R.id.text_possibility);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
holder.possibilityTitle.setText(possibilitiesList.get(position));
return convertView;
}
不知怎的,我觉得你的可能性方法很奇怪。我可能会用这样的东西
public void setPossibilitiesList(List<String> possibilitiesList) {
this.possibilitiesList = possibilitiesList;
notifyDataSetChanged();
}
public void addItem (final String item) {
possibilitiesList.add(item);
notifyDataSetChanged();
}
public void addItems (List<String> possibilitiesList) {
this.possibilitiesList.addAll(possibilitiesList);
notifyDataSetChanged();
}
此外,你不必投下它
已更新
@Override
public int getCount(){
for (String possibility : this.possibilities){
System.out.println(possibility);
}
int size = this.possibilities();
System.out.println("getCount: " + size);
return size;
}
更改方法addItem并从中删除notify,在metghod setList中的for之后添加notify最可能的情况是,当执行
getCount()
方法时,您将获得posabilitieslist.size()
作为1。打印日志以检查值。是否将列表嵌套在滚动视图中?这将是一个典型的行为,它只显示一个项目。尽量避免使用以下方法
/**
* read all adapter views and calculate total length
*
* @param listView
*/
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST);
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
totalHeight += listItem.getMeasuredHeight();
}
setListViewHeight(listView, totalHeight);
}
/**
* set listview height
*
* @param listView
* @param height
*/
public static void setListViewHeight(ListView listView, int height) {
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = height + (listView.getDividerHeight() * (listView.getAdapter().getCount() - 1));
listView.setLayoutParams(params);
listView.requestLayout();
}
/**
*读取所有适配器视图并计算总长度
*
*@param listView
*/
公共静态无效setListViewHeightBasedOnChildren(ListView ListView){
ListAdapter ListAdapter=listView.getAdapter();
如果(listAdapter==null){
返回;
}
int totalHeight=0;
int desiredWidth=MeasureSpec.makeMeasureSpec(listView.getWidth(),最多测量一次);
对于(int i=0;i
不,这是行不通的,正如我说的,你不能把ListView放在ScrollView里面
试试这个:
<?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">
<ListView
android:id="@+id/list_possibilities"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
你的getCount()
在哪里?发布你的getCount()
方法.extends BaseFragment?@blackbelt-对不起,我后来添加了那一行,但错误地从错误的文档复制粘贴了它。。我更正了。@kramer65在getCount
中记录大小。查看大小。这将不再提供动态更改数据的方法。那么更改的通知数据不应在每个项目后调用!!!它应该像这样调用public void setposabilitieslist(List posabilitieslist){for(字符串可能性:posabilitieslist){addItem(可能性);}Notify Here and remove Notify from addItem method}我不建议每次数据更改时都实例化一个新适配器。我尝试了你的建议,但不幸的是没有用。我仍然只得到要显示的第一个字符串。我尝试了您的建议,但它在这一行上导致一个空指针:holder.possibilityTitle.setText(position)(position));我试过了,但没用。此外,我没有看到8次相同的内容,但只有第一个项目一次。您还有其他想法吗?在每个方法、get count、add元素中放置断点,并告诉我们results@kramer65下一个逻辑步骤似乎是将getCount方法替换为我刚才添加的方法,幸运的是,情况并非如此;aLog.e(这是newInteger(getCount()).toString)代码>返回8。我建议您将日志放在getCount()方法中。因为当框架调用该方法时,sixe可能会被1调用。我还认为在可能性列表的其余7项中可能有空字符串,这也可能使textview不可见;它仍然显示8,我只是在适配器中循环了可能性列表,并打印了其中的所有字符串,它显示了所有st