티스토리 뷰
package com.real.reagain;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.android.volley.AuthFailureError;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.bumptech.glide.Glide;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import util.StaticValue;
public class MyListActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener {
String idx = "-1";
boolean isEnd = false;
boolean lastItemVisibleFlag = false;
ArrayList<ItemData> arr = new ArrayList<>();
MyAdapter adapter;
TextView tvTitle;
ListView lvMain;
ProgressBar loading_progress;
SwipeRefreshLayout swipe;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_list);
tvTitle = findViewById(R.id.tv_title);
lvMain = findViewById(R.id.lv_main);
loading_progress = findViewById(R.id.loading_progress);
swipe = findViewById(R.id.swipe);
swipe.setOnRefreshListener(this);
arr.add(new ItemData("1", "안녕", "개똥이", "2020,01,01"));
arr.add(new ItemData("2", "안녕2", "개똥이", "2020,01,01"));
arr.add(new ItemData("3", "안녕3", "개똥이", "2020,01,01"));
adapter = new MyAdapter(this);
lvMain.setAdapter(adapter);
lvMain.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//현재 화면에 보이는 첫번째 리스트 아이템의 번호(firstVisibleItem) + 현재 화면에 보이는 리스트 아이템의 갯수(visibleItemCount)가 리스트 전체의 갯수(totalItemCount) -1 보다 크거나 같을때
lastItemVisibleFlag = (totalItemCount > 0) && (firstVisibleItem + visibleItemCount >= totalItemCount);
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//OnScrollListener.SCROLL_STATE_IDLE은 스크롤이 이동하다가 멈추었을때 발생되는 스크롤 상태입니다.
//즉 스크롤이 바닦에 닿아 멈춘 상태에 처리를 하겠다는 뜻
if(scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE && lastItemVisibleFlag
&& isEnd ==false) {
//TODO 화면이 바닦에 닿을때 처리
lastItemVisibleFlag = false;
//통신 요청
idx = arr.get(arr.size()-1).idx;
request();
}
}
});
request();
}
private void request() {
/** post **/
loading_progress.setVisibility(View.VISIBLE);
RequestQueue stringRequest = Volley.newRequestQueue(this);
String url = "http://heutwo.dothome.co.kr/delete/free_list.php?idx=-1&token=721cecf8de3ffb8556586c116a298aa85a522bdb3ba11c070d5249644cea6172";
StringRequest myReq = new StringRequest(Request.Method.POST, url,
successListener, errorListener) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("idx", idx);
params.put("token", StaticValue.token);
return params;
}
};
myReq.setRetryPolicy(new DefaultRetryPolicy(3000, 0, 1f)
);
stringRequest.add(myReq);
}
Response.Listener<String> successListener = new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("aabb","res: "+response);
try {
swipe.setRefreshing(false);
loading_progress.setVisibility(View.INVISIBLE);
JSONObject jsonObject = new JSONObject(response);
if(jsonObject.getString("result").equalsIgnoreCase("OK")){
isEnd = jsonObject.getString("is_end").equalsIgnoreCase("n")?false:true;
if(idx.equalsIgnoreCase("-1")){
arr.clear();
}
JSONArray jsonArray = jsonObject.getJSONArray("list");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject temp = jsonArray.getJSONObject(i);
String idx = temp.getString("idx");
String title = temp.getString("title");
String content = temp.getString("content");
String writer = temp.getString("writer");
arr.add(new ItemData(idx, title, content,writer));
}
adapter.notifyDataSetChanged();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("aabb","error: ");
loading_progress.setVisibility(View.INVISIBLE);
swipe.setRefreshing(false);
int num = 10;
}
};
@Override
public void onRefresh() {
idx="-1";
request();
}
class ItemHolder {
TextView tvTitleHolder;
TextView tvWriterHolder;
}
class MyAdapter extends ArrayAdapter {
LayoutInflater lnf;
public MyAdapter(Activity context) {
super(context, R.layout.item, arr);
lnf = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return arr.size();
}
@Override
public Object getItem(int position) {
return super.getItem(position);
}
@Override
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ItemHolder viewHolder;
if (convertView == null) {
convertView = lnf.inflate(R.layout.item, parent, false);
viewHolder = new ItemHolder();
viewHolder.tvTitleHolder = convertView.findViewById(R.id.tv_title);
viewHolder.tvWriterHolder = convertView.findViewById(R.id.tv_writer);
convertView.setTag(viewHolder);
} else {
viewHolder = (ItemHolder) convertView.getTag();
}
viewHolder.tvTitleHolder.setText(arr.get(position).title);
viewHolder.tvWriterHolder.setText(arr.get(position).writer);
return convertView;
}
}
}
'ANDROID' 카테고리의 다른 글
상속 이용해서 코드 줄이기 (params 더미값) (0) | 2021.01.06 |
---|---|
댓글 입력, 삭제, 수정 시 변화 반영하여 화면 이동 없이 리스트 출력 (notifyDataSetChanged 위치/ position 변수 위치/private일 때는 set으로! public일 때는 get으로!) (0) | 2021.01.05 |
안드로이드에 서버(JSP) Product DB 가져와서 보여주기(글라이드/리스트뷰) (0) | 2020.12.31 |
왜 arr에 담긴 애들이 Listview에 출력이 안됐을까? (전역변수 설정) (0) | 2020.12.31 |
왜 계속 같은 proObject만 proArr에 들어갔는가?! (primitive type/ reference type) (0) | 2020.12.31 |
댓글