listView 的 ListAdapter 不起作用 - E/ViewRootImpl: performMeasure: view is null

ListAdapter for listView doesn't work - E/ViewRootImpl: performMeasure : view is null

我遵循这个例子https://github.com/codepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView 而这个 https://www.youtube.com/watch?v=FoX_WJ_bS8c&lc=z13nenkb1kbwhnoxb04cedjpkqnexzpyr34

一步一步来,但是当我的 activity 和我的 listView 启动时它完全是黑色的,但是应用程序没有锁定,如果我按下后退按钮,它会回到我的家 activity logcat 中唯一认为显示的是 E/ViewRootImpl: performMeasure : view is null

我是巴西人,抱歉我的英语不好

ListAdapterItem.java

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

/**
 * Created by Dener de Souza on 23/06/2016.
 */
public class ListaAdapterItem extends ArrayAdapter<Item> {
    private Context context;
    private ArrayList<Item> lista;

    /*private static class ViewHolder {
        TextView ipen;
        TextView hora;
    }*/

    public ListaAdapterItem(Context context, ArrayList<Item> lista){
        super(context, 0, lista);
        this.context = context;
        this.lista = lista;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Item itemPosicao = this.lista.get(position);

        /*if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.modelo_lidos2, parent, false);
        }*/
        convertView =     LayoutInflater.from(this.context).inflate(R.layout.modelo_lidos2, null);

        TextView lblIpen = (TextView)convertView.findViewById(R.id.lblIpen);
        lblIpen.setText(itemPosicao.getIpen());

        TextView lblData = (TextView)convertView.findViewById(R.id.lblData);
        lblData.setText(itemPosicao.getData());

        TextView lblHora = (TextView)convertView.findViewById(R.id.lblHr);
        lblHora.setText(itemPosicao.getHora());

        TextView lblLocal = (TextView)convertView.findViewById(R.id.lblLocal);
        lblLocal.setText(itemPosicao.getLocal());

        return convertView;
    }
}

Item.java

/**
 * Created by Dener de Souza on 23/06/2016.
 */
public class Item {
    private String id;
    private String ipen;
    private String data;
    private String hora;
    private String local;
    private String status;

    public Item(String id, String ipen, String data, String hora, String     local, String status) {
        this.id = id;
        this.ipen = ipen;
        this.data = data;
        this.hora = hora;
        this.local = local;
        this.status = status;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getIpen() {
        return ipen;
    }

    public void setIpen(String ipen) {
        this.ipen = ipen;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public String getHora() {
        return hora;
    }

    public void setHora(String hora) {
        this.hora = hora;
    }

    public String getLocal() {
        return local;
    }

    public void setLocal(String local) {
        this.local = local;
    }
}

通话清单

Cursor cursor = db.rawQuery("SELECT _id, ipen, dt, hr, local, ipen FROM lidos WHERE ipen LIKE '" +
            tbxPesquisa.getText().toString() + "%' AND local = '" +
            spnLocal.getSelectedItem().toString().trim() + "' " + dataPesq + " ORDER BY dt, hr", null);
    cursor.moveToFirst();
    ArrayList<Item> lista = new ArrayList<Item>();
    while (cursor.isAfterLast() == false){
        lista.add(new Item(cursor.getString(0), cursor.getString(1), cursor.getString(2),
                cursor.getString(3), cursor.getString(4), cursor.getString(5)));
        cursor.moveToNext();
    }


    ListaAdapterItem ad = new ListaAdapterItem(this, lista);
    ListView lstPed01 = (ListView)findViewById(R.id.lstDependente);
    lstPed01.setAdapter(ad);

试试这个:将您从数据库读取的代码部分放在注释中,并创建一个虚拟数据数组以查看您的问题是否涉及数据库问题。

在 CarregaGrid() 中查找;

import android.app.AlertDialog.Builder;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteCursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.ActionBarActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ArrayAdapter;
import android.widget.CursorAdapter;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

public class Lidos extends ActionBarActivity {

    private int idM;
    //android.widget.SimpleCursorAdapter adp = null;
    //SpecialAdapter adp = null;
    ListaAdapterItem adp = null;


    private DatePicker datePicker;
    private Calendar calendar;
    private TextView dateView;
    private int year, month, day;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu items for use in the action bar
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.action_bar_home, menu);
        return super.onCreateOptionsMenu(menu);

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle presses on the action bar items
        switch (item.getItemId()) {
            case R.id.home:
                Home();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    private void Home(){
        try{
            Context context = getApplicationContext();
            PackageManager pm = context.getPackageManager();
            Intent intent = pm.getLaunchIntentForPackage(context.getPackageName());
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            context.startActivity(intent);
        /*Intent intent = new Intent(getBaseContext(), Menu.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);*/
        }catch(Exception ex){Toast.makeText(getBaseContext(), ex.toString(), Toast.LENGTH_LONG).show();}
    }

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

        Metodos.CorActionBar(getSupportActionBar());

        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

        CarregaLocais();
        CarregarGrid();

        calendar = Calendar.getInstance();
        year = calendar.get(Calendar.YEAR);
        month = calendar.get(Calendar.MONTH);
        day = calendar.get(Calendar.DAY_OF_MONTH);
    }

    @Override
    public void onStart(){
        super.onStart();
        CarregarGrid();
    }

    public void onResume(){
        super.onResume();

        EditText tbxPesquisa = (EditText) findViewById(R.id.tbxPesquisar);

        tbxPesquisa.addTextChangedListener(new TextWatcher() {
            public void afterTextChanged(Editable s) {
            }

            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            public void onTextChanged(CharSequence s, int start, int before, int count) {
                CarregarGrid();
            }
        });
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
          super.onCreateContextMenu(menu, v, menuInfo);
          if (v.getId()==R.id.lstDependente) {
              MenuInflater inflater = getMenuInflater();
              idM = ((AdapterContextMenuInfo)menuInfo).position;
              inflater.inflate(R.menu.menu_contatos, menu);           
          }       
    }

    private void Editar(String id){
        /*SQLiteDatabase db = openOrCreateDatabase("db_sigin.db", Context.MODE_PRIVATE, null);
        Cursor c = db.rawQuery("SELECT _id, ipen FROM dados_pessoais WHERE _id = " + id, null);
        c.moveToFirst();
        Intent it = new Intent(getBaseContext(), MenuCadastro.class);       
        it.putExtra("id", Integer.parseInt(c.getString(1)));
        it.putExtra("tipo", 1);
        startActivity(it);*/
        Intent it = new Intent(getBaseContext(), CImagem.class);
        it.putExtra("id", Integer.parseInt(id));
        startActivity(it);
    }

    private void Deletar(String id){
        SQLiteDatabase db = openOrCreateDatabase("db_sigin.db", Context.MODE_PRIVATE, null);
        Cursor c = db.rawQuery("SELECT _id, ipen FROM lidos WHERE _id = " + id, null);
        c.moveToFirst();
        final String numserie = c.getString(1);

        final String id2 = id;
        Builder msg = new Builder(Lidos.this);
        msg.setMessage("Deseja Deletar este Interno da checagem de escaneados?");
        msg.setNegativeButton("Não", null);
        msg.setPositiveButton("Sim", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {
                SQLiteDatabase db = openOrCreateDatabase("db_sigin.db", Context.MODE_PRIVATE, null);


                if (db.delete("lidos", "_id = ?", new String[]{id2}) > 0) {

                    Toast.makeText(getBaseContext(),
                            "Interno Deletado.", Toast.LENGTH_SHORT).show();

                    CarregarGrid();
                } else {
                    Toast.makeText(getBaseContext(), "Erro ao Deletar o Interno.",
                            Toast.LENGTH_SHORT).show();
                }
            }
        });

        msg.show();
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
          AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
          //SQLiteCursor c = (SQLiteCursor)adp.getItem(idM);
          switch(item.getItemId()) {
             case R.id.editar:
                //Editar(String.valueOf(c.getInt(1)));
                 Editar(String.valueOf(adp.getItem(idM).getIpen()));
                return true;
             case R.id.deletar:
                //Deletar(String.valueOf(c.getInt(0)));
                 Deletar(String.valueOf(adp.getItem(idM).getId()));
                return true;
             default:
                    return super.onContextItemSelected(item);
          }
    }

    @Override
    protected Dialog onCreateDialog(int id) {
        // TODO Auto-generated method stub
        if (id == 999) {
            return new DatePickerDialog(this, myDateListener, year, month, day);
        }
        return null;
    }

    private DatePickerDialog.OnDateSetListener myDateListener = new DatePickerDialog.OnDateSetListener() {
        @Override
        public void onDateSet(DatePicker arg0, int arg1, int arg2, int arg3) {
            year = arg1;
            month = arg2;
            day = arg3;
            CarregarGrid();
            // arg1 = year
            // arg2 = month
            // arg3 = day
            //Toast.makeText(getBaseContext(), new StringBuilder().append(arg1).append("/")
            //      .append(arg2).append("/").append(arg3), Toast.LENGTH_SHORT).show();
        }
    };

    public void btnData_onClick(View v){
        showDialog(999);
    }

    private void CarregarGrid(){

        SQLiteDatabase db = openOrCreateDatabase("db_sigin.db", Context.MODE_PRIVATE, null);

        EditText tbxPesquisa = (EditText) findViewById(R.id.tbxPesquisar);
        Spinner spnLocal = (Spinner)findViewById(R.id.spnLocais);

        String dataPesq = " AND dt1 = " + year + " AND dt2 = " + (month + 1) + " AND dt3 = " + day;

        Cursor cursor = db.rawQuery("SELECT _id, ipen, dt, hr, local, ipen FROM lidos WHERE ipen LIKE '" +
                tbxPesquisa.getText().toString() + "%' AND local = '" +
                spnLocal.getSelectedItem().toString().trim() + "' " + dataPesq + " ORDER BY dt, hr", null);
        cursor.moveToFirst();
        ArrayList<Item> lista = new ArrayList<Item>();
        while (cursor.isAfterLast() == false){
            lista.add(new Item(cursor.getString(0), cursor.getString(1), cursor.getString(2),
                    cursor.getString(3), cursor.getString(4), cursor.getString(5)));
            cursor.moveToNext();
        }

        /*cursor = db.rawQuery("SELECT _id, ipen, dt, hr, local FROM lidos WHERE ipen LIKE '" +
                tbxPesquisa.getText().toString() + "%' AND local = '" +
                spnLocal.getSelectedItem().toString().trim() + "' " + dataPesq + " ORDER BY dt, hr", null);

        String[] from = {"ipen", "dt", "hr", "local"};
        int[] to = {R.id.lblIpen, R.id.lblDt, R.id.lblHr, R.id.lblLocal};

        android.widget.SimpleCursorAdapter ad = new android.widget.SimpleCursorAdapter(getBaseContext(),
                R.layout.modelo_lidos2, cursor, from, to);

        ListView lstPed01 = (ListView)findViewById(R.id.lstDependente);
        lstPed01.setAdapter(ad);*/
        ListaAdapterItem ad = new ListaAdapterItem(this, lista);
        ListView lstPed01 = (ListView)findViewById(R.id.lstDependente);
        lstPed01.setAdapter(ad);

        //adp = ad;
        //registerForContextMenu(lstPed01);



        /*lstPed01.setOnItemClickListener(new AdapterView.OnItemClickListener(){
            public void onItemClick(AdapterView adapter, View view,
                    int position, long id){

                SQLiteCursor c = (SQLiteCursor)adapter.getAdapter().getItem(position);


                Editar(String.valueOf(c.getInt(1)));
            }
        });*/

        db.close();
    }

    private void CarregaLocais() {
        SQLiteDatabase db = openOrCreateDatabase("db_sigin.db", Context.MODE_PRIVATE, null);
        Cursor cursor = null;
        Spinner spn = (Spinner)findViewById(R.id.spnUf);
        Spinner spnLocais = (Spinner) findViewById(R.id.spnLocais);
        List<String> listLocais = new ArrayList<String>();
        //db = openOrCreateDatabase("db_sigin.db", Context.MODE_PRIVATE, null);
        cursor = db.rawQuery("SELECT local FROM locais ORDER BY local", null);
        if (cursor.moveToFirst()){
            while(!cursor.isAfterLast()){
                listLocais.add(cursor.getString(0));
                cursor.moveToNext();
            }
        }
        ArrayAdapter<String> dataAdapterCidade = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, listLocais);
        dataAdapterCidade.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spnLocais.setAdapter(dataAdapterCidade);
        spnLocais.setOnItemSelectedListener(
                new AdapterView.OnItemSelectedListener() {
                    public void onItemSelected(
                            AdapterView<?> parent, View view, int position, long id) {
                        CarregarGrid();
                        //Toast.makeText(getBaseContext(), "Spinner1: " + spn.getSelectedItem().toString(), Toast.LENGTH_LONG).show();
                    }

                    public void onNothingSelected(AdapterView<?> parent) {
                        //showToast("Spinner1: unselected");
                    }
                });

        cursor = db.rawQuery("SELECT valor1 FROM parametros WHERE rotina = 'LOCAL_LEITOR'",
                null);
        cursor.moveToFirst();
        if (!String.valueOf(cursor.getInt(0)).trim().isEmpty()) {
            int numserie = cursor.getInt(0);

            cursor = db.rawQuery("SELECT numserie FROM locais ORDER BY local",
                    null);
            cursor.moveToFirst();
            int ind = 0;
            while (!cursor.isAfterLast()) {
                if (cursor.getInt(0) == numserie) {
                    Spinner spnLocal = (Spinner) findViewById(R.id.spnLocais);
                    spnLocal.setSelection(ind);
                }
                ind++;
                cursor.moveToNext();
            }
        }
    }


}

来自 ListAdapterItem class 的超级调用不应该是那样的。试试这个 `public class ListAdapterItem 扩展 ArrayAdapter{ ArrayList 列表; 内部资源; 语境语境;

public ListAdapterItem(Context context, int resource, ArrayList<Item> list){
    super(context, resource, list);
    this.list = list;
    this.resource = resource;
    this.context = context;
}

@Override
public View getView(){
    convertView = LayoutInflater.from(this.context).inflate(this.resource, parent, false);  
}}