Android: простой адаптер, нулевой указатель - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть приложение, которое я хочу получить с моего сервера с помощью PHP Json и получить метод, я использую для этого приложения простой адаптер, загрузчик Json и анализатор json,

У меня проблема с моим простым адаптеромчтобы показать мои данные в моем listView,

Когда я запускаю свой проект, происходит сбой и отображаются некоторые ошибки.

Это основное занятие:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mTextMessage = (TextView) findViewById(R.id.message);
    BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
    set_bedehkariha_list();


}

public void set_bedehkariha_list(){
    JSONDownloader jsdl = new JSONDownloader();
    String temp = jsdl.downloadURL( "http://famila1.ir/khabgah/get_khabgah_cash.php");

    List<HashMap<String,Object>> cash = new ArrayList<HashMap<String, Object>>();
    cashParser cashparse = new cashParser();
    cash= cashparse.parse(temp);

    String[] from = {"hazine","tozihat","hazine_shareTo","who_paid","date"};
    int[] to = {R.id.mablaq_hazine,R.id.babate_hazine,R.id.moshtarak_ba,R.id.pardakhtaz,R.id.tarikh_hazine};
    SimpleAdapter myadapter = new SimpleAdapter(MainActivity.this,cash, R.layout.cash_list_row,from,to);
    ListView lv = (ListView) findViewById(R.id.list_bedehkariha);
    lv.setAdapter(myadapter);
}

этоэто jsonDownloader:

  public class JSONDownloader
{
    public String downloadURL( String strUrl )
    {
        String data = "";

    try
    {
        URL url = new URL( strUrl );

        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        connection.setReadTimeout(10000);

        connection.setConnectTimeout(15000);

        connection.setRequestMethod("GET");

        connection.setDoInput(true);

        connection.connect();

        InputStream myStream = connection.getInputStream();

        BufferedReader br = new BufferedReader( new InputStreamReader( myStream ) );

        StringBuilder sb = new StringBuilder();

        String line;

        while ( ( line = br.readLine() ) != null )
        {
            sb.append( line );
        }

        data = sb.toString();

        br.close();

        connection.disconnect();

        myStream.close();
    }
    catch ( Exception e )
    {
        /*
          *Log.i( "MatiMessage" , "error in JSONDownloader in downloadURL() -> " + e.toString() );
          */
    }

    return data;
}

, и это мой JsonParser:

    public List<HashMap<String , Object>> parse( String json )
{
    List<HashMap<String , Object>> all_cash = new ArrayList<>();

    try
    {
        JSONObject jObj = new JSONObject( json );

        JSONArray jArr = jObj.getJSONArray( "cash" );

        for( int i = 0; i < jArr.length(); i ++ )
        {
            JSONObject temp = jArr.getJSONObject( i );

            HashMap<String , Object> cash = new HashMap<String , Object>();

            cash.put( "id" , temp.getString( "id" ) );
            cash.put( "member_id" , temp.getString( "member_id" ) );
            cash.put( "hazine" , temp.getString( "hazine" ) );
            cash.put( "date" , temp.getString( "date" ) );
            cash.put( "hazine_shareTo" , "hazine_shareTo" );
            cash.put( "tozihat" , temp.getString( "tozihat" ) );
            cash.put( "who_paid" , temp.getString( "who_paid" ) );
            all_cash.add( cash );
        }

    }
    catch ( Exception e )
    {
        /*
         * Log.i( "MatiMessage" , "error in cashParser in parse() -> " + e.toString() );
         */
    }

    return ( all_cash );
}

И это моя ошибка в основной активности при запуске приложения:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.aqamamad.myapplication/com.example.aqamamad.myapplication.MainActivity}:

java.lang.NullPointerException: попытка вызвать виртуальный метод «void android.widget.ListView.setAdapter (android.widget.ListAdapter)» для ссылки на пустой объект

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вам необходимо вызвать сеть Api в отдельном потоке.Попробуйте ниже

class DownloadTask extends AsyncTask<Void, Void, String> {
        JSONDownloader downloader;

        public DownloadTask() {
            downloader = new JSONDownloader();
        }

        @Override
        protected String doInBackground(Void... voids) {
            return downloader.downloadURL("http://famila1.ir/khabgah/get_khabgah_cash.php");
        }

        @Override
        protected void onPostExecute(String data) {
            super.onPostExecute(data);

            cashParser cashparse = new cashParser();
            List<HashMap<String,Object>> cash = cashparse.parse(data);

            String[] from = {"hazine","tozihat","hazine_shareTo","who_paid","date"};
            int[] to = {R.id.mablaq_hazine,R.id.babate_hazine,R.id.moshtarak_ba,R.id.pardakhtaz,R.id.tarikh_hazine};
            SimpleAdapter myadapter = new SimpleAdapter(MainActivity.this,cash, R.layout.cash_list_row,from,to);
            ListView lv = (ListView) findViewById(R.id.list_bedehkariha);
            lv.setAdapter(myadapter);
        }
    }

Наконец измените метод ниже, чтобы вызвать asyncTask.

public void set_bedehkariha_list() {
   new DownloadTask().execute();
}
0 голосов
/ 21 сентября 2018

ваш код содержит

onCreate()
    setContentView(R.layout.activity_main);
    set_bedehkariha_list()

...

set_bedehkariha_list()
    ListView lv = (ListView) findViewById(R.id.list_bedehkariha);

    // nullpointerexception here
    lv.setAdapter(myadapter);

, что означает, что либо R.layout.activity_main не содержит R.id.list_bedehkariha, либо set_bedehkariha_list () вызывается перед onCreate ()

...