Java 为什么我的Android ListAdapter只显示一项?

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

在我的Android应用程序中,我正试图构建我的第一个自定义listadapter。我现在设法让它显示一个项目,但不幸的是,只有在列表中有8个项目的地方才显示一个项目。我的适配器如下所示:

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方法替换为我刚才添加的方法,幸运的是,情况并非如此;a
Log.e(这是newInteger(getCount()).toString)返回8。我建议您将日志放在getCount()方法中。因为当框架调用该方法时,sixe可能会被1调用。我还认为在可能性列表的其余7项中可能有空字符串,这也可能使textview不可见;它仍然显示8,我只是在适配器中循环了可能性列表,并打印了其中的所有字符串,它显示了所有st