[英]I am facing an issue with RecyclerView no adapter attached, even after setting adapter an layout manager. I a
I want to fetch data from json file from the internet using url, After doing all the codes RecyclerView says no adapter attached.我想使用 url 从互联网上的 json 文件中获取数据,完成所有代码后 RecyclerView 说没有附加适配器。 I am not able to find out what is wrong with my code.
我无法找出我的代码有什么问题。
public class MainActivity extends AppCompatActivity {公共 class MainActivity 扩展 AppCompatActivity {
private String urlData = "https://vast-shore-74260.herokuapp.com/banks?city=MUMBAI";
private RecyclerView recyclerView;
private RecyclerView.Adapter Radapter;
private List<ListItem> listItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
//Using this listitem in recyclerView works just fine but when i try to to parse json file, RecyclerView says no adapter attached.
/*listItems = new ArrayList<>();
for (int i=0;i<=10;i++)
{
ListItem listItem = new ListItem(
"SBI"+(i+1),
"Lorem ipsum",
"SBIN00009945",
"khanapara",
"9945",
"ghy",
"kamrup",
"assam"
);
listItems.add(listItem);
}
Radapter = new MyAdapter(listItems,this);
recyclerView.setAdapter(Radapter);*/
Spinner dropdown = findViewById(R.id.spinner);
String[] items = new String[]{"Select City","Mumbai","Bangalore","Chennai"};
ArrayAdapter<String>adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_dropdown_item,items)
{
@Override
public boolean isEnabled(int position)
{
if (position == 0)
{
return false;
}
else
{
return true;
}
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent)
{
View view = super.getDropDownView(position,convertView,parent);
TextView txtView = (TextView)view;
if (position == 0)
{
txtView.setTextColor(Color.GRAY);
}
else
{
txtView.setTextColor(Color.BLACK);
}
return view;
}
};
dropdown.setAdapter(adapter);
listItems = new ArrayList<>();
loadRecyclerViewData();
}
private void loadRecyclerViewData()
{
final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Loading Data...");
progressDialog.show();
StringRequest stringRequest = new StringRequest(
Request.Method.GET,
urlData,
new Response.Listener<String>() {
@Override
public void onResponse(String s) {
progressDialog.dismiss();
try {
JSONObject jsonObject = new JSONObject(s);
JSONArray array = jsonObject.getJSONArray(urlData);
for (int i=0; i<array.length();i++)
{
JSONObject o = array.getJSONObject(i);
ListItem item = new ListItem(
o.getString("bank_name"),
o.getString("address"),
o.getString("ifsc"),
o.getString("branch"),
o.getInt("bank_id"),
o.getString("city"),
o.getString("district"),
o.getString("state")
);
listItems.add(item);
}
/*Radapter = new MyAdapter(listItems,getApplicationContext());
recyclerView.setAdapter(Radapter);*/
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(),error.getMessage(),Toast.LENGTH_LONG).show();
Log.e("errorcode",error.getMessage());
}
}
);
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
} }
There might be some problem in this code: Radapter = new MyAdapter(listItems,getApplicationContext());此代码中可能存在一些问题: Radapter = new MyAdapter(listItems,getApplicationContext()); recyclerView.setAdapter(Radapter);
recyclerView.setAdapter(雷达);
This is the Adapter class这是适配器 class
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<ListItem> listItems;
private Context context;
public MyAdapter(List<ListItem> listItemAdap, Context context) {
this.listItems = listItemAdap;
this.context = context;
}
@Override
public ViewHolder onCreateViewHolder( ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_items,parent,false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
ListItem listItem = listItems.get(position);
holder.txtviewBankName.setText(listItem.getBank_name());
holder.txtviewAddress.setText(listItem.getAddress());
holder.txtviewIfsc.setText(listItem.getIfsc());
holder.txtviewBranch.setText(listItem.getBranch());
holder.txtviewBankId.setText(listItem.getBank_id());
holder.txtviewCity.setText(listItem.getCity());
holder.txtviewDistrict.setText(listItem.getDistrict());
holder.txtviewState.setText(listItem.getState());
}
@Override
public int getItemCount() {
return listItems.size();
}
public class ViewHolder extends RecyclerView.ViewHolder
{
public TextView txtviewBankName;
public TextView txtviewAddress;
public TextView txtviewIfsc;
public TextView txtviewBranch;
public TextView txtviewBankId;
public TextView txtviewCity;
public TextView txtviewDistrict;
public TextView txtviewState;
public ViewHolder(View itemView) {
super(itemView);
txtviewBankName = (TextView)itemView.findViewById(R.id.bankName);
txtviewAddress = (TextView)itemView.findViewById(R.id.address);
txtviewIfsc = (TextView)itemView.findViewById(R.id.ifsc);
txtviewBranch = (TextView)itemView.findViewById(R.id.branch);
txtviewBankId = (TextView)itemView.findViewById(R.id.bankId);
txtviewCity = (TextView)itemView.findViewById(R.id.city);
txtviewDistrict = (TextView)itemView.findViewById(R.id.district);
txtviewState = (TextView)itemView.findViewById(R.id.state);
}
}
}
Change your MainActivity like this像这样更改您的 MainActivity
public class MainActivity extends AppCompatActivity {
private String urlData = "https://vast-shore-74260.herokuapp.com/banks?city=MUMBAI";
private RecyclerView recyclerView;
private RecyclerView.Adapter Radapter;
private List<ListItem> listItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
Spinner dropdown = findViewById(R.id.spinner);
String[] items = new String[]{"Select City","Mumbai","Bangalore","Chennai"};
ArrayAdapter<String>adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_dropdown_item,items)
{
@Override
public boolean isEnabled(int position)
{
if (position == 0)
{
return false;
}
else
{
return true;
}
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent)
{
View view = super.getDropDownView(position,convertView,parent);
TextView txtView = (TextView)view;
if (position == 0)
{
txtView.setTextColor(Color.GRAY);
}
else
{
txtView.setTextColor(Color.BLACK);
}
return view;
}
};
dropdown.setAdapter(adapter);
listItems = new ArrayList<>();
loadRecyclerViewData();
}
private void loadRecyclerViewData()
{
final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Loading Data...");
progressDialog.show();
StringRequest stringRequest = new StringRequest(
Request.Method.GET,
urlData,
new Response.Listener<String>() {
@Override
public void onResponse(String s) {
try {
JSONObject jsonObject = new JSONObject(s);
JSONArray array = jsonObject.getJSONArray(urlData);
for (int i=0; i<array.length();i++)
{
JSONObject o = array.getJSONObject(i);
ListItem item = new ListItem(
o.getString("bank_name"),
o.getString("address"),
o.getString("ifsc"),
o.getString("branch"),
o.getInt("bank_id"),
o.getString("city"),
o.getString("district"),
o.getString("state")
);
listItems.add(item);
}
Radapter = new MyAdapter(listItems,MainActivity.this);
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
progressDialog.dismiss();
recyclerView.setAdapter(Radapter);
}
});
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(),error.getMessage(),Toast.LENGTH_LONG).show();
Log.e("errorcode",error.getMessage());
}
}
);
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
}
Your JSON string has some wrong characters, it should be like this你的 JSON 字符串有一些错误的字符,应该是这样的
[{"ifsc":"ABHY0065001","bank_id":60,"branch":"RTGS-HO","address":"ABHYUDAYA BANK BLDG., B.NO.71, NEHRU NAGAR, KURLA (E), MUMBAI-400024","city":"MUMBAI","district":"GREATER MUMBAI","state":"MAHARASHTRA","bank_name":"ABHYUDAYA COOPERATIVE BANK LIMITED"}]
then for parsing this json you can use the com.google.Gson library like this然后解析这个 json 你可以像这样使用 com.google.Gson 库
Type listType = new TypeToken<ArrayList<ListItem>>() {}.getType();
String s = "[{\"ifsc\":\"ABHY0065001\",\"bank_id\":60,\"branch\":\"RTGS-HO\",\"address\":\"ABHYUDAYA BANK BLDG., B.NO.71, NEHRU NAGAR, KURLA (E), MUMBAI-400024\",\"city\":\"MUMBAI\",\"district\":\"GREATER MUMBAI\",\"state\":\"MAHARASHTRA\",\"bank_name\":\"ABHYUDAYA COOPERATIVE BANK LIMITED\"}]";
List<ListItem> items = new Gson().fromJson(s, listType);
then you can set this list as input into your Adapter then assign your adapter to your recycler.然后您可以将此列表设置为适配器的输入,然后将您的适配器分配给您的回收商。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.