Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android ListView ArrayAdapter不';我不能正常工作_Java_Android_Listview_Android Listview - Fatal编程技术网

Java Android ListView ArrayAdapter不';我不能正常工作

Java Android ListView ArrayAdapter不';我不能正常工作,java,android,listview,android-listview,Java,Android,Listview,Android Listview,我正在尝试用我自己的、定制的和所谓的“小部件”来制作一个Android ListView 这是我的小部件父类: public class Widget { protected Context context; protected int layout; protected int headlineId; protected int leftButtonId; protected int rightButtonId; protected int headlineTextId; protecte

我正在尝试用我自己的、定制的和所谓的“小部件”来制作一个Android ListView

这是我的小部件父类:

public class Widget {

protected Context context;

protected int layout;
protected int headlineId;
protected int leftButtonId;
protected int rightButtonId;
protected int headlineTextId;
protected View fragment;
protected LayoutInflater inflater;

protected View widgetView;
protected TextView headline;
protected ImageButton leftButton, rightButton;

protected void init() {
    context = fragment.getContext();

    widgetView = inflater.inflate(layout, parentLayout, false);

    headline = (TextView) widgetView.findViewById(headlineId);
    leftButton = (ImageButton) widgetView.findViewById(leftButtonId);
    rightButton = (ImageButton) widgetView.findViewById(rightButtonId);

    headline.setText(headlineTextId);

    leftButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(fragment.getContext(), "[Move]", Toast.LENGTH_SHORT).show();
        }
    });


    rightButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(fragment.getContext(), "[Hide]", Toast.LENGTH_SHORT).show();
        }
    });
}

public View getLayout() {
    return widgetView;
}

public int getLayoutId() {
    return layout;
}

public void setLayout(View layout) {
    this.widgetView = layout;
}

public int getHeadlineTextId() {
    return headlineTextId;
}

public TextView getHeadline() {
    return headline;
}

public void setHeadline(String s) {
    headline.setText(s);
}

public void setHeadline(int resId) {
    setHeadline(context.getString(resId));
}

}
我在扩展我的小部件子类时使用这个类,如下(摘录):

widget类背后的思想是:所有内容(包括包含所有数据的视图)都保存在这个类中,可以通过getLayout()调用

在我的片段中,我创建小部件并用数据(Getter和Setter)填充它们。一开始,我使用普通的线性布局,只是添加了一些小部件。一切正常

但现在我不得不使用ListView(性能),并尝试使用以下适配器:

public class WidgetAdapter extends ArrayAdapter<Widget> {

private ArrayList<Widget> widgets;

public WidgetAdapter(Context context, ArrayList<Widget> widgets) {
    super(context, 0, widgets);

    this.widgets = widgets;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    return getItem(position).getLayout();

}

private static class WidgetHolder {
    public Widget widget;
}

}
我希望你们中有人能帮助我


谢谢

列表视图正在循环使用您的
视图
s,因此它不必每次都创建一个新视图。如果创建了新视图,则需要逻辑,如果视图不为null,但要循环使用,则还需要逻辑

getView
方法中,您具有创建新视图的正确逻辑(
如果convertView==null


现在,如果视图不为null,则必须使
convertView
指向正确的小部件,因为如果视图不为null,它将尝试回收该视图,并且您返回该视图时不会更改它,从而提供意外的输出

请参阅以下答案:。您需要使用
ViewHolder
模式。对不起,这对我没有帮助。我的小部件结构我不必在适配器的getView()方法中膨胀。所有内容都已膨胀并保存在小部件类中。您需要将代码转换为
ListView
s的
ViewHolder
模式。
getView
循环使用视图,您看到的位置仅是可见的列表视图项(例如0-5)。可能与getView方法重复,但在我的第一个getView方法代码片段中,如果我只获取保存的视图(返回getItem(position).getLayout();)并对性能进行测试,它甚至不起作用。。为什么不起作用?@Dominik,我不知道为什么。听起来您的
widgetList
正在更改。我几乎可以保证,如果你的观点出了问题,那是因为观点回收。也许可以像其他人建议的那样查看viewholder模式。是的,我的
widgetList
正在改变。我做了一些测试并记录了列表。我已经查看了ViewHolder模式,但这并不能解决我的问题。我对此进行了一些思考。我认为您的问题可能是您在
onCreate
(我假设)中膨胀了视图,而不是在
getView
中使用
父视图组。
public class WidgetAdapter extends ArrayAdapter<Widget> {

private ArrayList<Widget> widgets;

public WidgetAdapter(Context context, ArrayList<Widget> widgets) {
    super(context, 0, widgets);

    this.widgets = widgets;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    return getItem(position).getLayout();

}

private static class WidgetHolder {
    public Widget widget;
}

}
    CustomWidgetListView widgetListView = (CustomWidgetListView) fragment.findViewById(R.id.now_list_view);

    ArrayList<Widget> widgetList = new ArrayList<Widget>();

    for (int i = 0; i < 20; i++) {

        NowWidget nowWidget = new NowWidget(fragment, inflater);

        nowWidget.setHeadline("Widget " + i);

        widgetList.add(nowWidget);

    }

    WidgetAdapter adapter = new WidgetAdapter(context, widgetList);
    widgetListView.setAdapter(adapter);
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    if (convertView == null) {
        Widget widget = getItem(position);
        convertView = widget.getLayout();
    }

    return convertView;
}