Android 无休止的回收器视图重复json数据
Mainactivity.java:Android 无休止的回收器视图重复json数据,android,json,android-recyclerview,repeat,Android,Json,Android Recyclerview,Repeat,Mainactivity.java: public class MainActivity extends AppCompatActivity { private List<Item> colors; private boolean hasMore; private AsyncTask asyncTask; private RecyclerView recyclerView; private List<TaskRow> mUsers
public class MainActivity extends AppCompatActivity {
private List<Item> colors;
private boolean hasMore;
private AsyncTask asyncTask;
private RecyclerView recyclerView;
private List<TaskRow> mUsers = new ArrayList<>();
String userid="3",Response;
static int pageno=1 ,recordsperpage=5;
private ArrayList<HashMap<String, String>> postList=new ArrayList<HashMap<String, String>>();
static boolean errored = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if (android.os.Build.VERSION.SDK_INT > 9)
{
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
colors = buildColors();
hasMore = true;
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setAdapter(new MaterialPaletteAdapter(colors, new RecyclerViewOnItemClickListener() {
@Override
public void onClick(View v, int position) {
if (colors.get(position) instanceof TaskRow) {
Toast toast = Toast.makeText(MainActivity.this, String.valueOf(position), Toast.LENGTH_SHORT);
toast.show();
}
}
}));
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.addItemDecoration(new DividerItemDecoration(this));
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (hasMore && !(hasFooter())) {
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
//position starts at 0
if (layoutManager.findLastCompletelyVisibleItemPosition() == layoutManager.getItemCount() - 2) {
/* asyncTask = new BackgroundTask();
Void[] params = null;
asyncTask.execute(params);*/
new GetPostData().execute();
}
}
}
});
}
@Override
protected void onPause() {
super.onPause();
if (asyncTask != null) {
asyncTask.cancel(false);
}
}
private class GetPostData extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
colors.add(new Footer());
recyclerView.getAdapter().notifyItemInserted(colors.size() - 1);
/*pDialog = new ProgressDialog(getActivity());
pDialog.setIndeterminate(true);
pDialog.setMessage("Please Wait...");*/
//pDialog.show();
}
@Override
protected String doInBackground(String... params) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
Log.e(this.getClass().toString(), e.getMessage());
}
return null;
}
protected void onPostExecute(String result) {
//pDialog.dismiss();
//rprogress.setVisibility(View.GONE);
if(pageno <5)
{
int size = colors.size();
colors.remove(size - 1);//removes footer
colors.addAll(buildColors());
recyclerView.getAdapter().notifyItemRangeChanged(size - 1, colors.size() - size);
Toast.makeText(getApplicationContext(), Integer.toString(pageno), Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(getApplicationContext(), "No More Post", Toast.LENGTH_LONG).show();
hasMore = false;
}
errored = false;
}
}
private boolean hasFooter() {
return colors.get(colors.size() - 1) instanceof Footer;
}
private ArrayList<Item> buildColors() {
ArrayList<Item> colors = new ArrayList<Item>(13);
Response = SocialWebService.invokeGetPostWS(userid, pageno, recordsperpage, "selectPostData", MainActivity.this);
try {
//JSONObject jsonRootObject = new JSONObject(MainCategory);
//Get the instance of JSONArray that contains JSONObjects
JSONArray jsonArray = new JSONArray(Response);
//Iterate the jsonArray and print the info of JSONObjects
String CityName, PostID,PostTypeID,PostedByID,PostDate,PostImageID,PostContent,Lang,Lat;
String LocationName,FirstName,LastName;
String Picture,ImageFull,UserID,UserName;
for(int i=0; i < jsonArray.length(); i++){
JSONObject jsonObject = jsonArray.getJSONObject(i);
CityName=jsonObject.getString("CityName");
PostID=jsonObject.getString("PostID");
PostTypeID=jsonObject.getString("PostTypeID");
PostedByID=jsonObject.getString("PostedByID");
PostDate=jsonObject.getString("PostDate");
PostImageID=jsonObject.getString("PostImageID");
PostContent=jsonObject.getString("PostContent");
Lang=jsonObject.getString("Lang");
Lat=jsonObject.getString("Lat");
LocationName=jsonObject.getString("LocationName");
FirstName=jsonObject.getString("FirstName");
LastName=jsonObject.getString("LastName");
Picture=jsonObject.getString("Picture");
ImageFull=jsonObject.getString("ImageFull");
UserID=jsonObject.getString("UserID");
UserName=jsonObject.getString("UserName");
HashMap<String, String> data=new HashMap<String,String>();
data.put("CityName",CityName);
data.put("PostID",PostID);
data.put("PostTypeID",PostTypeID);
data.put("PostedByID",PostedByID);
data.put("PostDate",PostDate);
data.put("PostImageID",PostImageID);
data.put("PostContent",PostContent);
data.put("Lang",Lang);
data.put("Lat",Lat);
data.put("LocationName",LocationName);
data.put("FirstName",FirstName);
data.put("LastName",LastName);
data.put("Picture",Picture);
data.put("ImageFull",ImageFull);
data.put("UserID",UserID);
data.put("UserName",UserName);
postList.add(data);
}
for(int i=0;i<postList.size();i++)
{
String cityname = postList.get(i).get("CityName");
String postid=postList.get(i).get("PostID");
String posttypeid = postList.get(i).get("PostTypeID");
String postedbyid=postList.get(i).get("PostedByID");
String postdate=postList.get(i).get("PostDate");
String postimageid=postList.get(i).get("PostImageID");
String postcontent=postList.get(i).get("PostContent");
String lang=postList.get(i).get("Lang");
String lat=postList.get(i).get("Lat");
String locationname=postList.get(i).get("LocationName");
String firstname=postList.get(i).get("FirstName");
String lastname=postList.get(i).get("LastName");
String picture=postList.get(i).get("Picture");
String imagefull=postList.get(i).get("ImageFull");
String userid=postList.get(i).get("UserID");
String username=postList.get(i).get("UserName");
colors.add(new TaskRow(cityname, postid,posttypeid,postedbyid,postdate,postimageid,postcontent,lang,lat,locationname,
firstname,lastname,picture,imagefull,userid,username ));
}
pageno++;
} catch (JSONException e) {e.printStackTrace();}
return colors;
}
}
我的适配器类:
public class MaterialPaletteAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<Item> data;
private RecyclerViewOnItemClickListener recyclerViewOnItemClickListener;
private static final int TYPE_COLOR = 0;
private static final int TYPE_FOOTER = 1;
public MaterialPaletteAdapter(@NonNull List<Item> data, RecyclerViewOnItemClickListener recyclerViewOnItemClickListener) {
this.data = data;
this.recyclerViewOnItemClickListener = recyclerViewOnItemClickListener;
}
@Override
public int getItemViewType(int position) {
if (data.get(position) instanceof TaskRow) {
return TYPE_COLOR;
} else if (data.get(position) instanceof Footer) {
return TYPE_FOOTER;
} else {
throw new RuntimeException("ItemViewType unknown");
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_COLOR) {
View row = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent, false);
PaletteViewHolder pvh = new PaletteViewHolder(row, recyclerViewOnItemClickListener);
return pvh;
} else {
View row = LayoutInflater.from(parent.getContext()).inflate(R.layout.progress_footer, parent, false);
FooterViewHolder vh = new FooterViewHolder(row);
return vh;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof PaletteViewHolder) {
TaskRow taskRow = (TaskRow) data.get(position);
PaletteViewHolder paletteViewHolder = (PaletteViewHolder) holder;
String myString = taskRow.getPicture();
try {
JSONArray arr = new JSONArray(myString);
byte[] myArray = new byte[myString.length()];
for (int k = 0; k < arr.length(); k++) {
myArray[k] = (byte) arr.getInt(k);
}
Bitmap bmp = BitmapFactory.decodeByteArray(myArray, 0, myArray.length);
paletteViewHolder.profilepic.setImageBitmap(bmp);//small user picture
} catch (JSONException e) {
e.printStackTrace();
}
paletteViewHolder.tvpostby.setText(taskRow.getFirstname() + " " + taskRow.getLastname());
String ackwardRipOff = taskRow.getPostdate().replace("/Date(", "").replace(")/", "");
long time = Long.parseLong(ackwardRipOff);
Date d= new Date(time);
paletteViewHolder.tvdatetime.setText(new SimpleDateFormat("dd-MMM-yyyy h:mm a").format(d));
paletteViewHolder.tvlocation.setText(taskRow.getCityname());
if(taskRow.getPosttypeid().equals("2") || taskRow.getPosttypeid().equals("4"))
{
String myString1 = taskRow.getImagefull();
try {
JSONArray arr = new JSONArray(myString1);
byte[] myArray = new byte[myString1.length()];
for (int k = 0; k < arr.length(); k++) {
myArray[k] = (byte) arr.getInt(k);
}
final Bitmap bmp1 = BitmapFactory.decodeByteArray(myArray, 0, myArray.length);
paletteViewHolder.imgpost.setImageBitmap(bmp1);//post picture
paletteViewHolder.imgpost.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp1.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
// Intent i=new Intent(getContext(), ImageFull.class);
// i.putExtra("Image",byteArray);
// getContext().startActivity(i);
}
});
} catch (JSONException e) {
e.printStackTrace();
}
paletteViewHolder.imgpost.setVisibility(View.VISIBLE);
}
paletteViewHolder.tvpost_text.setText(taskRow.getPostcontent());
}
}
@Override
public int getItemCount() {
return data.size();
}
public static class PaletteViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener {
public ImageView profilepic;
public TextView tvpostby;
public TextView tvdatetime;
public TextView tvlocation;
public TextView tvpost_text;
public ImageView imgpost;
public TextView tvlike;
public TextView tvlikelable;
public TextView tvcommentlable;
public TextView tvsharelable;
private RecyclerViewOnItemClickListener recyclerViewOnItemClickListener;
public PaletteViewHolder(View itemView, RecyclerViewOnItemClickListener recyclerViewOnItemClickListener) {
super(itemView);
profilepic=(ImageView)itemView.findViewById(R.id.profile_pic);
tvpostby=(TextView)itemView.findViewById(R.id.tv_postby);
tvdatetime=(TextView)itemView.findViewById(R.id.tv_date_time);
tvlocation=(TextView)itemView.findViewById(R.id.tv_location);
tvpost_text=(TextView)itemView.findViewById(R.id.tvpost_text);
imgpost=(ImageView)itemView.findViewById(R.id.img_post);
tvlike=(TextView)itemView.findViewById(R.id.tv_like);
tvlikelable=(TextView)itemView.findViewById(R.id.tv_like_lable);
tvcommentlable=(TextView)itemView.findViewById(R.id.tv_comment);
tvsharelable=(TextView)itemView.findViewById(R.id.tv_share);
imgpost.setVisibility(itemView.GONE);
this.recyclerViewOnItemClickListener = recyclerViewOnItemClickListener;
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
recyclerViewOnItemClickListener.onClick(v, getAdapterPosition());
}
}
public static class FooterViewHolder extends RecyclerView.ViewHolder {
public ProgressBar getProgressBar() {
return progressBar;
}
private ProgressBar progressBar;
public FooterViewHolder(View itemView) {
super(itemView);
progressBar = (ProgressBar) itemView.findViewById(R.id.footer);
}
}
}
公共类MaterialPaletteAdapter扩展了RecyclerView.Adapter{
私人名单数据;
私有RecycleServiceMonitorClickListener RecycleServiceMonitorClickListener;
私有静态最终整数类型_COLOR=0;
私有静态final int TYPE_FOOTER=1;
公共材料AletteAdapter(@NonNull列表数据,RecycleServiceMonitorClickListener RecycleServiceMonitorClickListener){
这个数据=数据;
this.RecycleServiceMonitorClickListener=RecycleServiceMonitorClickListener;
}
@凌驾
public int getItemViewType(int位置){
if(TaskRow的data.get(position)instanceof){
返回类型_颜色;
}else if(data.get(position)instanceof Footer){
返回类型\页脚;
}否则{
抛出新的RuntimeException(“ItemViewType未知”);
}
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
如果(视图类型==类型颜色){
查看行=LayoutFlater.from(parent.getContext()).flate(R.layout.row,parent,false);
PaletteViewHolder pvh=新PaletteViewHolder(行,RecycleServiceMonitorClickListener);
返回pvh;
}否则{
查看行=LayoutFlater.from(parent.getContext()).flate(R.layout.progress\u footer,parent,false);
FooterViewHolder vh=新的FooterViewHolder(行);
返回vh;
}
}
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){
if(PaletteViewHolder的保持架实例){
TaskRow TaskRow=(TaskRow)data.get(position);
PaletteViewHolder PaletteViewHolder=(PaletteViewHolder)holder;
字符串myString=taskRow.getPicture();
试一试{
JSONArray arr=新的JSONArray(myString);
byte[]myArray=新字节[myString.length()];
对于(int k=0;kpublic class MaterialPaletteAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<Item> data;
private RecyclerViewOnItemClickListener recyclerViewOnItemClickListener;
private static final int TYPE_COLOR = 0;
private static final int TYPE_FOOTER = 1;
public MaterialPaletteAdapter(@NonNull List<Item> data, RecyclerViewOnItemClickListener recyclerViewOnItemClickListener) {
this.data = data;
this.recyclerViewOnItemClickListener = recyclerViewOnItemClickListener;
}
@Override
public int getItemViewType(int position) {
if (data.get(position) instanceof TaskRow) {
return TYPE_COLOR;
} else if (data.get(position) instanceof Footer) {
return TYPE_FOOTER;
} else {
throw new RuntimeException("ItemViewType unknown");
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_COLOR) {
View row = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent, false);
PaletteViewHolder pvh = new PaletteViewHolder(row, recyclerViewOnItemClickListener);
return pvh;
} else {
View row = LayoutInflater.from(parent.getContext()).inflate(R.layout.progress_footer, parent, false);
FooterViewHolder vh = new FooterViewHolder(row);
return vh;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof PaletteViewHolder) {
TaskRow taskRow = (TaskRow) data.get(position);
PaletteViewHolder paletteViewHolder = (PaletteViewHolder) holder;
String myString = taskRow.getPicture();
try {
JSONArray arr = new JSONArray(myString);
byte[] myArray = new byte[myString.length()];
for (int k = 0; k < arr.length(); k++) {
myArray[k] = (byte) arr.getInt(k);
}
Bitmap bmp = BitmapFactory.decodeByteArray(myArray, 0, myArray.length);
paletteViewHolder.profilepic.setImageBitmap(bmp);//small user picture
} catch (JSONException e) {
e.printStackTrace();
}
paletteViewHolder.tvpostby.setText(taskRow.getFirstname() + " " + taskRow.getLastname());
String ackwardRipOff = taskRow.getPostdate().replace("/Date(", "").replace(")/", "");
long time = Long.parseLong(ackwardRipOff);
Date d= new Date(time);
paletteViewHolder.tvdatetime.setText(new SimpleDateFormat("dd-MMM-yyyy h:mm a").format(d));
paletteViewHolder.tvlocation.setText(taskRow.getCityname());
if(taskRow.getPosttypeid().equals("2") || taskRow.getPosttypeid().equals("4"))
{
String myString1 = taskRow.getImagefull();
try {
JSONArray arr = new JSONArray(myString1);
byte[] myArray = new byte[myString1.length()];
for (int k = 0; k < arr.length(); k++) {
myArray[k] = (byte) arr.getInt(k);
}
final Bitmap bmp1 = BitmapFactory.decodeByteArray(myArray, 0, myArray.length);
paletteViewHolder.imgpost.setImageBitmap(bmp1);//post picture
paletteViewHolder.imgpost.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp1.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
// Intent i=new Intent(getContext(), ImageFull.class);
// i.putExtra("Image",byteArray);
// getContext().startActivity(i);
}
});
} catch (JSONException e) {
e.printStackTrace();
}
paletteViewHolder.imgpost.setVisibility(View.VISIBLE);
}
paletteViewHolder.tvpost_text.setText(taskRow.getPostcontent());
}
}
@Override
public int getItemCount() {
return data.size();
}
public static class PaletteViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener {
public ImageView profilepic;
public TextView tvpostby;
public TextView tvdatetime;
public TextView tvlocation;
public TextView tvpost_text;
public ImageView imgpost;
public TextView tvlike;
public TextView tvlikelable;
public TextView tvcommentlable;
public TextView tvsharelable;
private RecyclerViewOnItemClickListener recyclerViewOnItemClickListener;
public PaletteViewHolder(View itemView, RecyclerViewOnItemClickListener recyclerViewOnItemClickListener) {
super(itemView);
profilepic=(ImageView)itemView.findViewById(R.id.profile_pic);
tvpostby=(TextView)itemView.findViewById(R.id.tv_postby);
tvdatetime=(TextView)itemView.findViewById(R.id.tv_date_time);
tvlocation=(TextView)itemView.findViewById(R.id.tv_location);
tvpost_text=(TextView)itemView.findViewById(R.id.tvpost_text);
imgpost=(ImageView)itemView.findViewById(R.id.img_post);
tvlike=(TextView)itemView.findViewById(R.id.tv_like);
tvlikelable=(TextView)itemView.findViewById(R.id.tv_like_lable);
tvcommentlable=(TextView)itemView.findViewById(R.id.tv_comment);
tvsharelable=(TextView)itemView.findViewById(R.id.tv_share);
imgpost.setVisibility(itemView.GONE);
this.recyclerViewOnItemClickListener = recyclerViewOnItemClickListener;
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
recyclerViewOnItemClickListener.onClick(v, getAdapterPosition());
}
}
public static class FooterViewHolder extends RecyclerView.ViewHolder {
public ProgressBar getProgressBar() {
return progressBar;
}
private ProgressBar progressBar;
public FooterViewHolder(View itemView) {
super(itemView);
progressBar = (ProgressBar) itemView.findViewById(R.id.footer);
}
}
}
protected void onPostExecute(String result) {
//pDialog.dismiss();
//rprogress.setVisibility(View.GONE);
if(pageno <5)
{
int size = colors.size();
colors.remove(size - 1);//removes footer
colors.clear(); // just clear your array before adding new items to it
colors.addAll(buildColors());
recyclerView.getAdapter().notifyItemRangeChanged(size - 1, colors.size() - size);
Toast.makeText(getApplicationContext(), Integer.toString(pageno), Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(getApplicationContext(), "No More Post", Toast.LENGTH_LONG).show();
hasMore = false;
}
errored = false;
}