Android Studio Pull 刷新 recyclerview 动画不起作用

问题描述

在我的 recyclerview 中,我从 Internet 获取数据,下拉它会刷新数据,但在从 Internet 检索信息的过程中,刷新图标似乎冻结了。

enter image description here

不确定我做错了什么。 票务活动.java

public class TicketActivity extends AppCompatActivity {
    SwipeRefreshLayout swipeLayout;
    String LOG_TAG = "ONLINE TICKET: ";
    ArrayList<String> ticketIDList,issueList,statusList,created_dateList;
    RecyclerView recyclerView;

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

        ticketIDList = new ArrayList<>();
        issueList = new ArrayList<>();
        statusList = new ArrayList<>();
        created_dateList = new ArrayList<>();

        // Getting SwipeContainerLayout
        swipeLayout = findViewById(R.id.swipeContainer);
        recyclerView = findViewById(R.id.rvItems);

        getTicketDetails();

        // Adding Listener
        swipeLayout.setonRefreshListener(() -> {
            getTicketDetails();
            Toast.makeText(getApplicationContext(),"Refreshed!",Toast.LENGTH_LONG).show();
            swipeLayout.setRefreshing(false);
        });
    }


    void getTicketDetails() {
        ticketIDList.clear();
        issueList.clear();
        statusList.clear();
        created_dateList.clear();

        Thread thread = new Thread(() -> {
            try {
                String response_code;
                String response_data = NetworkUtils.ticket_details("dev","General");

                if (response_data != null) {
                    JSONObject obj_response = new JSONObject(response_data);
                    response_code = obj_response.getString("ResponseCode");

                    String issue,ticket_number,created_date,status;
                    if (response_code.equals("200")) {
                        JSONArray response_all_data = obj_response.getJSONArray("ResponseData");
                        for (int j = 0; j < response_all_data.length(); j++) {
                            JSONObject row_details = response_all_data.getJSONObject(j);
                            ticket_number = row_details.getString("ticket_number");
                            issue = row_details.getString("issue");
                            created_date = row_details.getString("created_date");
                            status = row_details.getString("status");

                            ticketIDList.add(ticket_number);
                            issueList.add(issue);
                            statusList.add(status);
                            created_dateList.add(created_date);
                        }
                    }
                }
            } catch (Exception e) {
                Log.i(LOG_TAG,"Error" + e.toString());
            }
        });
        thread.start();

        try {
            thread.join();
            GridLayoutManager gridLayoutManager = new GridLayoutManager(getApplicationContext(),1);
            recyclerView.setLayoutManager(gridLayoutManager);

            CustomAdapter_Tickets customAdapter = new CustomAdapter_Tickets(this,ticketIDList,created_dateList);
            recyclerView.setAdapter(customAdapter); // set the Adapter to RecyclerView

        } catch (Exception e) {
            Log.i(LOG_TAG,"Error" + e.toString());
        }
    }
}

CustomAdapter_Tickets.java

    class CustomAdapter_Tickets extends RecyclerView.Adapter<CustomAdapter_Tickets.MyViewHolder> {

    ArrayList<String> ticketIDList,created_dateList;

    Context context;

    public CustomAdapter_Tickets(Context context,ArrayList<String> ticketIDList,ArrayList<String> issueList,ArrayList<String> statusList,ArrayList<String> created_dateList) {
        this.context = context;
        this.ticketIDList = ticketIDList;
        this.issueList = issueList;
        this.statusList = statusList;
        this.created_dateList = created_dateList;
    }

    @NonNull
    @Override
    public CustomAdapter_Tickets.MyViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
        // inflate the item Layout
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.ticket_layout,parent,false);
        return new CustomAdapter_Tickets.MyViewHolder(v);
    }

    @Override
    public void onBindViewHolder(CustomAdapter_Tickets.MyViewHolder holder,final int position) {
        // set the data in items
        holder.txt_ticket_number.setText(String.format("ID: %s",ticketIDList.get(position)));
        holder.txt_issue.setText(String.format("%s",issueList.get(position)));
        holder.txt_status.setText(String.format("%s",statusList.get(position)));
        holder.txt_created_date.setText(String.format("%s",created_dateList.get(position)));
    }


    @Override
    public int getItemCount() {
        return ticketIDList.size();
    }

    public static class MyViewHolder extends RecyclerView.ViewHolder {
        TextView txt_ticket_number,txt_issue,txt_status,txt_created_date;
        CardView card_view;

        public MyViewHolder(View itemView) {
            super(itemView);
            txt_ticket_number = itemView.findViewById(R.id.txt_ticket_number);
            txt_issue = itemView.findViewById(R.id.txt_issue);
            txt_status = itemView.findViewById(R.id.txt_status);
            txt_created_date = itemView.findViewById(R.id.txt_created_date);
            card_view = itemView.findViewById(R.id.card_view);
        }
    }
}

ticket_layout.xml

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tickets_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <androidx.cardview.widget.CardView
        android:id="@+id/card_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:textSize="16sp">

            <TextView
                android:id="@+id/txt_ticket_number"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <TextView
                android:id="@+id/txt_issue"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <TextView
                android:id="@+id/txt_status"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <TextView
                android:id="@+id/txt_created_date"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <View
                android:id="@+id/divider"
                android:layout_width="match_parent"
                android:layout_height="2dp"
                android:background="?android:attr/listDivider" />

        </LinearLayout>

    </androidx.cardview.widget.CardView>

</LinearLayout>

activity_ticket.xml

 <androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swipeContainer"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rvItems"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

解决方法

你应该设置刷新为真

    swipeLayout.setOnRefreshListener(() -> {
                swipeLayout.setRefreshing(true);
                getTicketDetails();
            });

稍后在您的 getTicketDetails 函数中,您可以在收到数据后将其设置为 false

    void getTicketDetails() {
        ticketIDList.clear();
        issueList.clear();
        statusList.clear();
        created_dateList.clear();

        Thread thread = new Thread(() -> {
            try {
                String response_code;
                String response_data = NetworkUtils.ticket_details("dev","General");

                if (response_data != null) {
                    JSONObject obj_response = new JSONObject(response_data);
                    response_code = obj_response.getString("ResponseCode");

                    String issue,ticket_number,created_date,status;
                    if (response_code.equals("200")) {
                        JSONArray response_all_data = obj_response.getJSONArray("ResponseData");
                        for (int j = 0; j < response_all_data.length(); j++) {
                            JSONObject row_details = response_all_data.getJSONObject(j);
                            ticket_number = row_details.getString("ticket_number");
                            issue = row_details.getString("issue");
                            created_date = row_details.getString("created_date");
                            status = row_details.getString("status");

                            ticketIDList.add(ticket_number);
                            issueList.add(issue);
                            statusList.add(status);
                            created_dateList.add(created_date);
                        }
                    }
                }
            } catch (Exception e) {
                Log.i(LOG_TAG,"Error" + e.toString());
            }
        });
        thread.start();

        try {
            thread.join();
            GridLayoutManager gridLayoutManager = new GridLayoutManager(getApplicationContext(),1);
            recyclerView.setLayoutManager(gridLayoutManager);

            CustomAdapter_Tickets customAdapter = new CustomAdapter_Tickets(this,ticketIDList,issueList,statusList,created_dateList);
            recyclerView.setAdapter(customAdapter); // set the Adapter to RecyclerView
Toast.makeText(getApplicationContext(),"Refreshed!",Toast.LENGTH_LONG).show();
swipeLayout.setRefreshing(false);
        } catch (Exception e) {
            Log.i(LOG_TAG,"Error" + e.toString());
        }
    }

这应该可以解决您的问题..