recyclerview仅显示在屏幕上

quhf5bfb  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(341)

**结束。**此问题需要详细的调试信息。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。

10天前关门了。
改进这个问题
我使用改型从php(localhost)获取json格式的数据,并用recycler视图显示它。我的问题是我的数据从来没有显示时,我去全屏(图1)和正常时,我最小化的应用程序(图2)。
图1
图2
这是我的密码:
java /Kotlin
网络配置

package com.example.simplemysqlproject

import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import com.google.gson.JsonObject
import org.json.JSONObject
import retrofit2.Call
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.GET
import retrofit2.http.POST

class NetworkConfig {
    // set interceptor
    fun getInterceptor() : OkHttpClient {
        val logging = HttpLoggingInterceptor()
        logging.level = HttpLoggingInterceptor.Level.BODY
        val okHttpClient = OkHttpClient.Builder()
                .addInterceptor(logging)
                .build()
        return  okHttpClient
    }
    fun getRetrofit() : Retrofit {
        return Retrofit.Builder()
                .baseUrl(Constants.Root_URL)
                .client(getInterceptor())
                .addConverterFactory(GsonConverterFactory.create())
                .build()
    }
    fun getService() = getRetrofit().create(Users::class.java)
}
interface Users {
    @POST("ShowUser.php/")
    fun getUsers(): Call<JsonObject>
}

户表

package com.example.simplemysqlproject

import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.android.volley.Request
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley
import com.google.gson.JsonArray
import org.json.JSONException
import com.google.gson.JsonObject
import org.json.JSONObject
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import java.util.*

class UserTable : AppCompatActivity() {
    private lateinit var rv: RecyclerView
    private var userAdapter:UserRVAdapter?=null
    private var userListData:MutableList<UserData> = ArrayList()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.read_user)
        initRecyclerView();
        showRetro();
        userAdapter?.notifyDataSetChanged()
    }
    private fun showRetro(){
        var jsonObject:Callback<JsonObject>?=null
        NetworkConfig().getService()
                .getUsers()
                .enqueue(object :Callback<JsonObject>{
                    override fun onResponse(call: Call<JsonObject>, response: Response<JsonObject>) {
                        var jsonArray=response.body()?.getAsJsonArray("data")
                        var b:Int=0
                        for(i in 0..(jsonArray?.size()?.minus(1)!!)){
                            userListData.add(UserData(jsonArray?.get(i)?.asJsonObject?.get("id")?.
                                asInt,jsonArray?.get(i)?.asJsonObject?.get("Username")?.asString,
                                    jsonArray?.get(i)?.asJsonObject?.get("email")?.asString))
                        }
                        Toast.makeText(this@UserTable, response.body()?.get("message").toString().trim(), Toast.LENGTH_LONG).show()
                        userAdapter?.submitList(userListData)
                    }

                    override fun onFailure(call: Call<JsonObject>, t: Throwable) {
                        Toast.makeText(this@UserTable, t.localizedMessage, Toast.LENGTH_LONG).show()
                    }

                })
    }
    private fun addDataSet() {
        var stringRequest=StringRequest(Request.Method.POST, Constants.ShowAll_URL,
                com.android.volley.Response.Listener<String> { response ->
                    try {
                        var jsonObject: org.json.JSONObject = org.json.JSONObject(response)
                        var jsonArray = jsonObject.getJSONArray("data")
                        for (a in 0 until jsonArray.length()) {
                            var b: org.json.JSONObject = jsonArray.getJSONObject(a)
                            userListData.add(UserData(b.getInt("id"), b.getString("Username"), b.getString("email")))
                            userAdapter?.submitList(userListData)
                        }
                    } catch (e: JSONException) {
                        e.printStackTrace()
                    }
                },
                com.android.volley.Response.ErrorListener {

                }

        )

        var reqQueue=Volley.newRequestQueue(this@UserTable)
        reqQueue.add(stringRequest)
    }

    private fun initRecyclerView() {
        rv=findViewById<RecyclerView>(R.id.recycler_view)
        rv.apply {
            layoutManager=LinearLayoutManager(this@UserTable)
            userAdapter=UserRVAdapter()
            adapter=userAdapter
        }
    }
}

用户数据

package com.example.simplemysqlproject

data class UserData(

        var id: Int?,

        var username: String?,

        var email: String?

)

用户适配器

package com.example.simplemysqlproject

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions
import java.util.*

class UserRVAdapter:RecyclerView.Adapter<RecyclerView.ViewHolder>(){
    private val TAG: String = "AppDebug"

    private var items: List<UserData> = ArrayList()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return BlogViewHolder(
                LayoutInflater.from(parent.context).inflate(R.layout.user_data, parent, false)
        )
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        when(holder) {

            is BlogViewHolder -> {
                holder.bind(items.get(position))
            }

        }
    }

    override fun getItemCount(): Int {
        return items.size
    }

    fun submitList(userList: List<UserData>){
        items = userList
    }

    class BlogViewHolder
    constructor(
            itemView: View
    ): RecyclerView.ViewHolder(itemView){

        val username:TextView = itemView.findViewById(R.id.tvUsername)
        val email:TextView = itemView.findViewById(R.id.tvEmail)

        fun bind(userdata: UserData){
            /*
            val requestOptions = RequestOptions()
                    .placeholder(R.drawable.ic_launcher_background)
                    .error(R.drawable.ic_launcher_background)

            */
            /*
            Glide.with(itemView.context)
                    .applyDefaultRequestOptions(requestOptions)
                    .load(blogPost.image)
                    .into(blog_image)
                    */
            username.setText(userdata.username)
            email.setText(userdata.email)
        }

    }

}

xml格式
读取用户

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/recycler_view"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

用户数据

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:cardElevation="10dp"
    app:cardCornerRadius="2dp"
    app:cardPreventCornerOverlap="false"
    >
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="10dp">
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/tvUsername"
                android:text="Username"
                android:textColor="#000"
                android:textSize="19sp"
                />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/tvEmail"
                android:text="Email"
                android:textSize="19sp"
                android:layout_marginTop="10dp"
                />
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:orientation="horizontal"
            android:layout_gravity="center"
            android:gravity="center"
            android:layout_height="wrap_content">
            <ImageButton
                android:layout_width="50dp"
                android:layout_height="50dp"
                app:srcCompat="@drawable/edit"
                android:id="@+id/imageButton"
                android:tint="@color/purple_700" />
            <ImageButton
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_marginLeft="20dp"
                app:srcCompat="@drawable/wrong"
                android:id="@+id/wrongButton"
                android:tint="@color/colorAccent" />
        </LinearLayout>
</androidx.cardview.widget.CardView>

php操作数据库

<?php
    class OperationDB{
        private $con;
        function __construct(){
            require_once dirname(__FILE__).'/ConnectDB.php';
            $db= new ConnectDB();
            $this->con= $db->connect();
        }
        public function CreateUser($username,$password,$email){
            if($this->isUserExist($username,$email)){
                return 0;
            }
            else
            {
                $pass=md5($password);
                $CreateQuery=$this->con->prepare("INSERT INTO `user data` 
                (`id`, `Username`,`Password`,`Email`) VALUES (NULL,?,?,?);");
                    $CreateQuery->bind_param("sss",$username,$pass,$email);
                if($CreateQuery->execute()){
                    return 1;
                }
                else{
                    return 2;
                }
            }
        }
        public function ShowAll(){
            $sql="SELECT id,Username,email FROM `user data`;";
            $result=mysqli_query($this->con,$sql);
            return $result;
        }
        public function LoginUser($username,$password){
            $pass=md5($password);
            $LoginQuery=$this->con->prepare("SELECT id FROM `user data` WHERE username=? AND password=?");
            $LoginQuery->bind_param("ss",$username, $pass);
            $LoginQuery->execute();
            $LoginQuery->store_result();
            return $LoginQuery->num_rows>0;
        }
        public function DeleteUser($id){
            $DeleteQuery=$this->con->prepare("DELETE from `user data` where id=?");
            $DeleteQuery->bind_param("i",$id);
        }
        private function isUserExist($username,$email){
            $CheckQuery=$this->con->prepare("SELECT id FROM `user data` WHERE
            username=? or email=?");
            $CheckQuery->bind_param("ss",$username,$email);
            $CheckQuery->execute();
            $CheckQuery->store_result();
            return $CheckQuery->num_rows>0;
        }
    }

显示用户

<?php
    require_once '../includes/OperationDB.php';
    $response=array();
    $dataArray=array();
    if($_SERVER['REQUEST_METHOD']=='POST'){
        $db=new OperationDB();
        if($OperationResult=$db->ShowAll()){
            while($row=mysqli_fetch_assoc($OperationResult)){
                $dataArray[]=$row;
            }
            $response['data']=$dataArray;
            $response['error']=false;
            $response['message']="Showing Data!";
        }
        else{
            $response['error']=true;
            $response['message']="Showing failed!";  
        }
    }
    else{
        $response['error']=true;
        $response['message']="Invalid Request Bro";
    }
    echo json_encode($response);

感谢您的帮助:)

l7mqbcuq

l7mqbcuq1#

因为排队是异步的。从回调获取数据后,必须调用notifydatasetchanged

userAdapter?.submitList(userListData)
userAdapter?.notifyDataSetChanged()

fun submitList(userList: List<UserData>){
        items = userList
        notifyDataSetChanged()
    }

相关问题