繁体   English   中英

在自定义ArrayAdapter上更新ListView

[英]Updating ListView On Custom ArrayAdapter

如果这与其他线程类似,我深表歉意,但是我还没有找到有关如何在自定义ArrayAdapter中更新ListView的好的解决方案。

我正在扩展FragmentActivity以创建用于添加/更新新List条目的自定义Dialog弹出窗口(效果很好),但是在进行更改后,似乎无法让ServerActivityArrayAdapter中的ListView更新。

显然,adapter.notifyDataSetChanged(); ServersActivity类中的“内存”还不够,但是我对如何在ServerDialog弹出窗口中单击“保存”按钮后如何更新ListView感到困惑。 任何帮助将不胜感激!

public class ServersActivity extends FragmentActivity {

private List<Server> server;
private ListView lv;
private ServerActivityArrayAdapter adapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.server_list);

    server = getServers();

    lv = (ListView) findViewById(android.R.id.list);
    adapter = new ServerActivityArrayAdapter(this, R.layout.server_list_item, server);
    lv.setAdapter(adapter);

    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            showServerDialog(position);
        }
    });
}

...

private void showServerDialog(int position) {
    android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
    ServerDialog serverDialog = new ServerDialog(position);
    ServerDialog.newInstance();
    serverDialog.show(fragmentManager, "server_dialog");
}

ServerDialog类,用于添加新的List条目

public class ServerDialog extends DialogFragment {

...

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.settings_fragment, container);

    context = getActivity().getApplicationContext();
    dbh = new DbHandler(context);

    etName = (EditText) view.findViewById(R.id.etName);
    etAddress = (EditText) view.findViewById(R.id.etAddress);
    etPort = (EditText) view.findViewById(R.id.etPort);
    swtchNumDoors = (Switch) view.findViewById(R.id.swtchNumDoors);
    Button btnSave = (Button) view.findViewById(R.id.btnSave);

    loadData();
    String title = (!newServer) ? "Edit Server" : "Add A New Server " + ID;
    getDialog().setTitle(title);

    btnSave.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {

            server[ID] = String.valueOf(ID);
            server[SERVER_NAME] = etName.getText().toString();
            server[ADDRESS] = etAddress.getText().toString();
            server[PORT] = etPort.getText().toString();

            if (server[ADDRESS].isEmpty() || server[PORT].isEmpty()) {
                Toast.makeText(context, "Invalid Entry", Toast.LENGTH_LONG).show();
            } else {
                saveData();
                // TODO - notify ServersActivity of change
            }
        }
    });

    return view;
}

public class ServerActivityArrayAdapter extends ArrayAdapter<Server> {

private int layout;
private String[][] values;
private int defServer;

private static LayoutInflater inflater;

ServerActivityArrayAdapter类,用于显示ListView

public ServerActivityArrayAdapter(Context context, int layout, List<Server> servers) {
    super(context, layout, servers);

    this.layout = layout;

    int i = 0;
    values = new String[servers.size()][5];

    for (Server server : servers) {
        values[i][0] = Integer.toString(server.id);
        values[i][1] = server.name;
        values[i][2] = server.address;
        values[i][3] = Integer.toString(server.port);
        values[i][4] = Integer.toString(server.num_doors);
        defServer = (server.default_server) ? i : 0;
        i++;
    }

    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

private static class ViewHolder {
    private TextView tvServerName;
    private CheckBox cbDefault;
}

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

    ViewHolder holder;
    View v = convertView;

    try {
        if(v == null) {
            v = inflater.inflate(layout, parent, false);
            holder = new ViewHolder();
            holder.tvServerName = (TextView) v.findViewById(R.id.tvServerName);
            holder.cbDefault = (CheckBox) v.findViewById(R.id.cbDefault);
            v.setTag(holder);
        } else {
            holder = (ViewHolder) v.getTag();
        }
        holder.tvServerName.setText(values[position][1]);
        holder.cbDefault.setChecked(defServer==position);

    } catch (Exception e){
        System.out.println(e);
    }

    return v;
}

您可以使用接口并在其中有一个方法,该方法可能名为updateListView()。

在FragmentActivity中实现此接口。 在实现的方法中,添加代码以更新listView。

在对话框的按钮代码中,调用[[Interfacename)getActivity).updateListView()

您的问题在于适配器的实现。 您正在使用List<Server>对象实例化ArrayAdapter (超级调用),然后创建自己的二维数组values以包含数据。 您将values数组用于getView()方法,但未提及或未通过代码显示如何实际修改数据以更新适配器。

您应该回叫适配器以对其进行更新。 EG,调用add()remove()等。您只提到更新数据库,这与更新适配器无关。 它无论如何都没有链接到数据库。 即使您要在适配器上调用前面提到的mutate方法,也不能使用它们,除非您专门override它们。 默认的ArrayAdapter实现将修改List<Server>数据,而不是您创建的二维数组的values

但是,如果您发现自己override这些mutate方法以支持values二维数组,那么在ArrayAdapter子类化中就没有意义了。 ArrayAdapter是为您处理所有数据管理。 在这种情况下,您应该改为BaseAdapter

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM