Как получить доступ к findViewById во фрагментном представлении - Kotln - PullRequest
1 голос
/ 27 апреля 2020

Я пытаюсь показать список данных, поступающих из файла json с сервера.

Когда я пытаюсь выбрать представление по Id, выдается ошибка.


import android.os.AsyncTask
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ListView
import android.widget.ProgressBar
import kotlinx.android.synthetic.*
import org.json.JSONObject
import java.net.URL

// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"

/**
 * A simple [Fragment] subclass.
 * Use the [HomeFragment.newInstance] factory method to
 * create an instance of this fragment.
 */
class HomeFragment : Fragment() {
    // TODO: Rename and change types of parameters
    private var param1: String? = null
    private var param2: String? = null
    var dataList = ArrayList<HashMap<String, String>>()
    private var res: View? = null ;


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            param1 = it.getString(ARG_PARAM1)
            param2 = it.getString(ARG_PARAM2)
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        this.res  = inflater.inflate(R.layout.fragment_home, container, false);

        return res;
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

        fetchJsonData().execute()

    }

    companion object {
        /**
         * Use this factory method to create a new instance of
         * this fragment using the provided parameters.
         *
         * @param param1 Parameter 1.
         * @param param2 Parameter 2.
         * @return A new instance of fragment HomeFragment.
         */
        // TODO: Rename and change types and number of parameters
        @JvmStatic
        fun newInstance(param1: String, param2: String) =
            HomeFragment().apply {
                arguments = Bundle().apply {
                    putString(ARG_PARAM1, param1)
                    putString(ARG_PARAM2, param2)
                }
            }
    }

    /**
     * Asyntask for getting list view
     * from and point
     */

    inner class fetchJsonData() : AsyncTask<String, Void, String>() {
        override fun onPreExecute() {
            super.onPreExecute()
        }

        override fun doInBackground(vararg params: String?): String? {
            return URL("https://www.androdocs.com/files/uploads/original/sample-json-data-1567767983.txt").readText(
                Charsets.UTF_8
            )
        }

        override fun onPostExecute(result: String?) {
            super.onPostExecute(result)

            super.res.findViewById<ProgressBar>(R.id.loader).visibility = View.GONE

            val jsonObj = JSONObject(result)
            val usersArr = jsonObj.getJSONArray("users")
            for (i in 0 until usersArr.length()) {
                val singleUser = usersArr.getJSONObject(i)

                val map = HashMap<String, String>()
                map["name"] = singleUser.getString("name")
                map["age"] = singleUser.getString("age")
                map["city"] = singleUser.getString("city")
                map["image"] = singleUser.getString("image")
                dataList.add(map)
            }

            findViewById<ListView>(R.id.listView).adapter =
                CustomAdapter(this@HomeFragment, dataList)

        }
    }
}


Ниже приведен мой код.

После получения Json в AsynTask мне нужно остановить загрузчик и передать загруженные данные. Вот где его ошибка метания.

1 Ответ

1 голос
/ 27 апреля 2020

Вы можете попробовать этот подход.

lateinit var progressBar: ProgressBar // Global declare

Затем

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        progressBar = view.findViewById(R.id.loader)
        // You can declare your listview here
        fetchJsonData().execute()    
    }

Затем

 override fun onPostExecute(result: String?) {
            super.onPostExecute(result)
            progressBar.visibility = View.GONE
...