java - 即使在将适配器设置为布局管理器之后,我也面临着 RecyclerView 没有附加适配器的问题。我一个

标签 java android android-recyclerview

我想使用 url 从互联网上的 json 文件中获取数据,在完成所有代码后,RecyclerView 说没有附加适配器。我无法找出我的代码有什么问题。

公共(public)类 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);


}

}

这段代码可能存在一些问题: Radapter = new MyAdapter(listItems,getApplicationContext()); recyclerView.setAdapter(Radapter);

这是适配器类



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);
        }
    }
}

最佳答案

你的 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"}]

然后为了解析这个 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);

然后您可以将此列表设置为适配器的输入,然后将适配器分配给回收商。

关于java - 即使在将适配器设置为布局管理器之后,我也面临着 RecyclerView 没有附加适配器的问题。我一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58485319/

相关文章:

java - 从多个线程修改 ArrayAdapter 时如何防止 ConcurrentModificationException?

java - 我如何在 RecyclerView.Adapter 类中创建警报对话框生成器

java - 使用 switch 语句比使用 if 语句更快,还是将 case 放在 hashMap 中并只使用 contains 方法?

java.lang.IllegalArgumentException : Comparison method violates its general contract (not reproducible)

android - 未决 Intent 不起作用,通知不打开 Activity

android - SetView AlertDialogBu​​ilder 奇怪的行为

java - 有没有办法在Java中“直接”将 float 转换为整数

java - 覆盖抽象方法时的通用代码 - 设计问题

android - 如何修改 android master/detail Activity 中的虚拟内容?

android - 如何在 Recycler View 中添加 2 个部分标题?