问题描述
当我发送新数据或更新信息时,如何更改回收视图?
我使用了dapter.notifyDataSetChanged();
,但是它不起作用...
我尝试了更多方法,但这一切都无法更改我的回收站视图
在我的代码中
recyclerView = view.findViewById(R.id.recyclerCoin);
recyclerView.setHasFixedSize(true);
layoutManager = new linearlayoutmanager(getActivity());
recyclerView.setLayoutManager(layoutManager);
listCoinDiamondModel = new ArrayList<>();
requestQueue = Volley.newRequestQueue(getActivity());
getData();
adapter = new CoinAdapter(listCoinDiamondModel,getActivity());
recyclerView.setAdapter(adapter);
private void sendGift(String postUserID) {
final String postUserIDD = postUserID;
final String GiftAmount = this.GiftAmount.getText().toString().trim();
final String flag = "1";
StringRequest stringRequest = new StringRequest(Request.Method.POST,URL_GIFTCOIN,new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
String success = jsonObject.getString("success");
if (success.equals("1")){
adapter.notifyDataSetChanged();
}
} catch (JSONException e) {
e.printstacktrace();
Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_SHORT).show();
}
}
},new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(),"Error" + error.toString(),Toast.LENGTH_SHORT).show();
}
})
{
@Override
protected Map<String,String> getParams() throws AuthFailureError {
Map<String,String> params = new HashMap<>();
//Log.d("FID",fid);
params.put("fid",fid);
params.put("GiftAmount",GiftAmount);
params.put("flag",flag);
params.put("postUserID",postUserIDD);
params.put("uid",getID);
return params;
}
};
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
requestQueue.add(stringRequest);
}
private JsonArrayRequest getDataFromServer(int requestCount) {
//Initializing ProgressBar
final ProgressDialog progressDialog = new ProgressDialog(getActivity());
progressDialog.setMessage("Load...");
progressDialog.dismiss();
final String GROUP_LIST = "https://example.com/aaa.PHP?flag=1&fid="+ getActivity().getIntent().getStringExtra("fid") +"&page="+requestCount;
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(GROUP_LIST,new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
parseData(response);
progressDialog.dismiss();
}
},new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
progressDialog.dismiss();
Toast.makeText(getActivity(),"No More gift Available",Toast.LENGTH_SHORT).show();
}
});
//Returning the request
return jsonArrayRequest;
}
//This method will get data from the web api
private void getData() {
requestQueue.add(getDataFromServer(requestCount));
requestCount++;
}
//This method will parse json data
private void parseData(JSONArray array) {
for (int i = 0; i < array.length(); i++) {
//Creating the newFeedModel object
final CoinDiamondModel coinDiamondModel = new CoinDiamondModel();
JSONObject json = null;
try {
//Getting json
json = array.getJSONObject(i);
String TAG_Coin = "Coin";
String TAG_Diamond = "Diamond";
String TAG_UserName = "UserName";
String TAG_UserPhoto = "UserPhoto";
String TAG_UserID = "UserID";
//Log.d("NAME111",json.getString(json.getString(TAG_UserName)));
coinDiamondModel.setCoin(json.getString(TAG_Coin));
coinDiamondModel.setDiamond(json.getString(TAG_Diamond));
coinDiamondModel.setGiftFromUserName(json.getString(TAG_UserName));
coinDiamondModel.setGiftFromUserPhoto(json.getString(TAG_UserPhoto));
coinDiamondModel.setGiftFromUserID(json.getString(TAG_UserID));
} catch (JSONException e) {
e.printstacktrace();
}
//Adding the newFeedModel object to the list
listCoinDiamondModel.add(coinDiamondModel);
//adapter.addTheCoinData(coinDiamondModel);
}
//Notifying the adapter that data has been added or changed
adapter.notifyDataSetChanged();
}
谁知道会发生什么,如何解决呢?
你能告诉我怎么办吗?
适应所有代码
public class CoinAdapter extends RecyclerView.Adapter<CoinAdapter.ViewHolder> {
private ImageLoader imageLoader;
private List<CoinDiamondModel> newcoinDiamondLists;
private RequestManager glide;
private Context context;
SessionManager sessionManager;
private String getID,memail;
public CoinAdapter(List<CoinDiamondModel> newcoinDiamondLists,Context context) {
this.newcoinDiamondLists = newcoinDiamondLists;
this.glide = Glide.with(context);
this.context = context;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.coinlist,parent,false);
ViewHolder viewHolder = new ViewHolder(v);
sessionManager = new SessionManager(getApplicationContext());
sessionManager.checkLogin();
HashMap<String,String> user = sessionManager.getUserDetail();
getID = user.get(sessionManager.USERID);
memail = user.get(sessionManager.EMAIL);
//String gid = getIntent.getStringExtra("xxx");
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder,int position) {
CoinDiamondModel newCoinDiamondModel = newcoinDiamondLists.get(position);
imageLoader = CustomVolleyRequest.getInstance(context).getimageLoader();
holder.userName.setText(newCoinDiamondModel.getGiftFromUserName());
holder.userID.setText(newCoinDiamondModel.getGiftFromUserID());
holder.coinCount.setText(" x "+newCoinDiamondModel.getCoin());
glide.load(newCoinDiamondModel.getGiftFromUserPhoto()).into(holder.userPhoto);
}
@Override
public int getItemCount() {
return newcoinDiamondLists.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
CircleImageView userPhoto;
TextView userName,userID,coinCount;
ImageView coinImg;
public ViewHolder(@NonNull View itemView) {
super(itemView);
userPhoto = (CircleImageView) itemView.findViewById(R.id.userPhoto);
userName = (TextView) itemView.findViewById(R.id.userName);
coinCount = (TextView) itemView.findViewById(R.id.coinCount);
userID = (TextView) itemView.findViewById(R.id.userID);
coinImg = (ImageView) itemView.findViewById(R.id.coinImg);
}
}
public void addTheCoinData(CoinDiamondModel coinDiamondModel){
if(coinDiamondModel!=null){
newcoinDiamondLists.add(coinDiamondModel);
notifyDataSetChanged();
}else {
throw new IllegalArgumentException("無資料!");
}
}
}
解决方法
您可以在服务器响应后再次将适配器设置为回收站视图
public void onResponse(JSONArray response) {
parseData(response);
progressDialog.dismiss();
adapter = new CoinAdapter(listCoinDiamondModel,getActivity());
recyclerView.setAdapter(adapter);
}
解决方案2: 在您的适配器中编写一个功能来更新您的列表 并在活动中调用函数
将此功能添加到适配器
public void updateList(List<CoinDiamondModel> list){
newcoinDiamondLists = list;
notifyDataSetChanged();
}
并在需要更新recyclerview时调用函数updateList
正确使用了RecyclerView初始化和notifyDataSetChanged()
。由于您对RecyclerView的Adapter实现的问题还不清楚,因此,我可以提出一些建议进行检查。
- 在
RecyclerView.Adapter
中,通过返回列表长度(不为0),检查getItemCount()
方法是否正确覆盖,如下所示:
@Override public int getItemCount() { return listdata.length; }
- 在
RecyclerView.Adapter
中,检查onCreateViewHolder
方法是否被正确的xml布局正确地覆盖,如下所示:
@Override public ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) { LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); View listItem= layoutInflater.inflate(R.layout.coin_xml_layout,parent,false); ViewHolder viewHolder = new ViewHolder(listItem); return viewHolder; }
- 在
RecyclerView.Adapter
中检查RecyclerView.ViewHolder
类是否正确扩展 并将xml中的UI元素与适配器链接在一起,如下所示:
public static class ViewHolder extends RecyclerView.ViewHolder { public TextView coinTextView; public ViewHolder(View itemView) { super(itemView); this.coinTextView = (TextView) itemView.findViewById(R.id.coinTextView); } }
- 在
RecyclerView.Adapter
中,检查onBindViewHolder
方法是否被正确覆盖并正确地更新列表组件用户界面,如下所示:
@Override public void onBindViewHolder(ViewHolder holder,int position) { final MyListData myListData = listdata[position]; holder.cointTextView.setText(listdata[position].getCoin()); }
- 使用断点进行调试,并检查
listCoinDiamondModel.add(coinDiamondModel)
是否在调用并且coinDiamondModel
对象是否为空。 - RecyclerView正确放置在活动xml中,就像RecyclerView是可见的一样,它的大小足以显示列表元素。例如:
,android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical"
您可以像这样手动更新适配器列表:(在适配器中编写此功能)
public void updateCoinAdapterList(ArrayList<listCoinDiamondModel> recyclerItemsList) {
this.recyclerItemsList = recyclerItemsList;
this.notifyDataSetChanged();
}
您必须设置适配器全局变量,并在OnCreate或OnResume中对其进行初始化,然后调用
adapter.updateCoinAdapterList(listCoinDiamondModel);
列表更改时