#android #android-recyclerview #android-progressbar #pull-to-refresh
#Android #android-recyclerview #android-панель прогресса #вытягивание для обновления
Вопрос:
В моем recyclerview я получаю данные из Интернета, и когда он отключается, он обновляет данные, но в процессе извлечения информации из Интернета значок обновления, похоже, зависает.
Не уверен, что я делаю неправильно. TicketActivity.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, issueList, statusList, 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, issueList, statusList, 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>
Комментарии:
1. Это кажется проблемой, зависящей от устройства. убедитесь, что вы не включили анимацию в настройках отладки, также режим энергосбережения также может привести к отключению анимации. Проверьте это на каком-либо другом устройстве.
2. К сожалению, я не могу найти опцию анимации. Более того, когда я пытаюсь использовать реальное устройство, та же проблема. Кроме того, когда я удаляю setRefreshing(false), он работает после загрузки данных, а не в то время, когда он фактически пытается извлечь данные.
Ответ №1:
вы должны установить обновление true
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());
}
}
это должно решить вашу проблему..
Комментарии:
1. Извините @unownsp, это не сработало. Но когда я отключаю swipeLayout.setRefreshing(false); анимация работает после загрузки данных, а не когда она фактически пытается извлечь данные.
2. Возможно, вам следует попробовать обработчик (Runnable) вместо вашего потока … это может быть вашей проблемой