代码之家  ›  专栏  ›  技术社区  ›  random1234

ArrayList未显示在RecyclerView中

  •  -3
  • random1234  · 技术社区  · 9 年前

    这是我到目前为止的代码,但RecyclerView没有显示任何内容。

    所有代码更新为我的当前代码

    public class MainActivity extends AppCompatActivity {
    
    private ActivityMainViewModel viewmodel;
    RecyclerView recyclerView;
    MainAdapter mAdapter;
    public static ArrayList<Integer> rideList = new ArrayList<>();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
    
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    
        viewmodel = new ActivityMainViewModel();
        binding.setViewmodel(viewmodel);
    
        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        mAdapter = new MainAdapter(rideList);
        recyclerView.setAdapter(mAdapter);
    }
    

    以下是MainAdapter类:

    class MainAdapter extends android.support.v7.widget.RecyclerView.Adapter<MainAdapter.ViewHolder> {
    
    private ArrayList<Integer> rideList;
    
    public MainAdapter(ArrayList<Integer> rideList)
    {
        this.rideList = rideList;
    }
    
    @Override
    public MainAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent, false);
        return new ViewHolder(view);
    }
    
    @Override
    public void onBindViewHolder(MainAdapter.ViewHolder holder, int position)
    {
        holder.rideHeight.setText(String.valueOf(rideList.get(position)));
    }
    
    @Override
    public int getItemCount()
    {
        return rideList.size();
    }
    
    public class ViewHolder extends RecyclerView.ViewHolder {
    
        public TextView rideHeight;
        public ViewHolder(View itemView) {
            super(itemView);
    
            rideHeight = (TextView) itemView.findViewById(R.id.rideHeight_textView);
        }
    }
    

    }

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    
    <TextView
        android:id="@+id/rideHeight_textView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="20sp"/>
    
    </LinearLayout>
    

    我知道这看起来可能很混乱,但那是因为我一直在谷歌和youtube上搜索如何使用RecyclerView,所以我可能混合了不同的教程,自己尝试了一些东西。

    谢谢

    编辑:根据请求添加的JsonData代码:

    public class JsonData
    {
    public ObservableField<String> dropHeight = new ObservableField<>();
    public ObservableField<String> rideCount = new ObservableField<>();
    int eID;
    int sID;
    
    public JsonData()
    {
        dropHeight.set("");
        rideCount.set("");
    }
    
    public void downloadFromSkistar()
    {
        if (SettingsActivity.submitClicked)
        {
            eID = SettingsActivity.x;
            sID = SettingsActivity.y;
        }
        else
        {
            eID = 3206;
            sID = 11;
        }
    
        try
        {
            URL url = new URL("https://www.skistar.com/myskistar/api/v2/views/statisticspage.json?entityId=" + eID + "&seasonId=" + sID + " ");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(10000 /* milliseconds */);
            conn.setConnectTimeout(15000 /* milliseconds */);
            conn.setRequestMethod("GET");
            // Starts the query
            conn.connect();
    
            int response = conn.getResponseCode();
            Log.i("AndroidExample", "Response: " + response);
    
            if (response == 200)
            {
                String json = getJson(conn.getInputStream());
    
                JSONObject jsonObject = new JSONObject(json);
                JSONArray jsonArray = jsonObject.getJSONArray("rideStatistics");
    
                int reponame = 0;
                int rHeight = 0;
    
                for (int i = 0; i < jsonArray.length(); i++)
                {
                    JSONObject skiRun = jsonArray.getJSONObject(i);
                    reponame += skiRun.getInt("height");
    
                    rHeight += skiRun.getInt("height");
                    MainActivity.rideList.add(new Integer(rHeight));
                    rHeight = 0;
                }
                final int height = reponame;
                final int count =  jsonArray.length();
    
                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        dropHeight.set("" + height);
                        rideCount.set("" + count);
                    }
                });
            }
        }
        catch (Exception e)
        {
            Log.i("AndroidExample", "Error");
        }
        finally
        {
        }
    }
    
    private String getJson(InputStream stream) throws IOException
    {
        BufferedReader reader;
        reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
    
        StringBuilder builder = new StringBuilder();
        String line;
    
        while ((line = reader.readLine()) != null) {
            builder.append(line + '\n');
        }
        //Should be placed in finally
        stream.close();
        return builder.toString();
    }
    }
    
    4 回复  |  直到 9 年前
        1
  •  0
  •   Enamul Haque    9 年前

    1. public class CustomModel {
       private  int it;
      
        public int getIt() {
         return it;
         }
      
        public void setIt(int it) {
         this.it = it;
          }
       }
      
    2. 适配器。。。

           private class  MainAdapter extends RecyclerView.Adapter<MainAdapter.ViewHolder>{
      
      public MainAdapter(ArrayList<CustomModel> list){
      
          dataSet = list;
      }
      
      @Override
      public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
      
          View itemLayoutView = LayoutInflater.from(viewGroup.getContext()).inflate(
                  R.layout.row, null);
      
          itemLayoutView.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT));
      
          MainAdapter.ViewHolder viewHolder = new MainAdapter.ViewHolder(itemLayoutView);
      
          return viewHolder;
      }
      
      
      @Override
      public void onBindViewHolder(ViewHolder viewHolder, int position) {
          CustomModel cardModel = dataSet.get(position);
          viewHolder.rideHeight_textView.setText(String.valueOf(cardModel.getId()));
      
      }
      
      @Override
      public int getItemCount() {
          return dataSet.size();
      }
      
      public void updateList(List<CustomModel> temp) {
          dataSet = (ArrayList<CustomModel>) temp;
          notifyDataSetChanged();
      }
      
      public  class ViewHolder extends RecyclerView.ViewHolder {
      
          public TextView rideHeight_textView;
      
      
      
          public ViewHolder(View itemLayoutView) {
              super(itemLayoutView);
      
              rideHeight_textView = (TextView) itemLayoutView  .findViewById(R.id.rideHeight_textView);
      
      
              itemLayoutView.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View view) {
                     //action ****
                  }
              });
          }
           }
      
      }
      
    3. 打个电话就行了

       ArrayList<CustomModel> menuList = new ArrayList<>();
      CustomModel c = new CustomModel();
      c.setIt(1);
      recyclerView.setHasFixedSize(true);
      // ListView
      recyclerView.setLayoutManager(new LinearLayoutManager(Your activity.this));
      // create an Object for Adapter
      MainAdapter mAdapter = new MainAdapter(menuList);
      // set the adapter object to the Recyclerview
      recyclerView.setAdapter(mAdapter);
      
    4.  <?xml version="1.0" encoding="utf-8"?>
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:orientation="vertical"
         android:background="#ffffff"
          android:padding="@dimen/activity_vertical_margin"
          android:layout_width="match_parent"
           android:layout_height="wrap_content">
      
      <TextView
       android:id="@+id/rideHeight_textView"
       android:layout_width="match_parent"
        android:layout_height="wrap_content"
       android:textColor="#000000"
       android:textSize="20sp"/>
      
       </LinearLayout>
      
        2
  •  0
  •   Misagh    9 年前
    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    recyclerView.setHasFixedSize(true);
    LinearLayoutManager layoutManager = new LinearLayoutManager(context);
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(layoutManager);
    mAdapter = new MainAdapter(JsonData.rideList, MainActivity.this);
    recyclerView.setAdapter(mAdapter);
    mAdapter.notifyDataSetChanged();
    

    class MainAdapter extends android.support.v7.widget.RecyclerView.Adapter<MainAdapter.ViewHolder> {
    
            private ArrayList<Integer> rideList = new ArrayList<>();
            private Context context;
    
            public MainAdapter(ArrayList<Integer> rideList, Context context)
            {
    
        this.context = context;
          this.rideList = rideList;
        }
    
        @Override
        public MainAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
        {
            View view = LayoutInflater.from(context).inflate(R.layout.row, parent, false);
            return new ViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder(MainAdapter.ViewHolder holder, int position)
        {
            holder.rideHeight.setText(String.valueOf(rideList.get(position)));
        }
    
        @Override
        public int getItemCount()
        {
            return rideList.size();
        }
    
        public class ViewHolder extends RecyclerView.ViewHolder {
    
            public TextView rideHeight;
            public ViewHolder(View itemView) {
                super(itemView);
    
                rideHeight = (TextView) itemView.findViewById(R.id.rideHeight_textView);
            }
        }
        }
    

    row.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:background="#ffffff"
    android:padding="@dimen/activity_vertical_margin"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    
    <TextView
        android:id="@+id/rideHeight_textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="#000000"
        android:textSize="20sp"/>
    
    </LinearLayout>
    
        3
  •  0
  •   M.Waqas Pervez    9 年前

    对于初学者来说,您没有在中调用数据获取程序方法 JsonData

    在适配器类中添加以下方法:

    public void setList(ArrayList<Integer> rideList)
    {
    this.rideList = rideList;
    notifyDataSetChanged();
    }
    

    类别添加:

    private MainAdapter adapter;
    
    public JsonData(MainAdapter adapter)
    {
    this.adapter = adapter;
    dropHeight.set("");
    rideCount.set("");
    }
    

    和改变 downloadFromSkistar

    public void downloadFromSkistar()
    {
    if (SettingsActivity.submitClicked)
    {
        eID = SettingsActivity.x;
        sID = SettingsActivity.y;
    }
    else
        {
            eID = 3206;
            sID = 11;
        }
     new AsyncTask<Void, Void, List<Integer>>() {
    
                                @Override
                                protected List<Integer> doInBackground(Void... voids) {
    
    try
    {
    
        URL url = new 
     URL("https://www.skistar.com/myskistar/api/v2/views/statisticspage.json?
     entityId=" + eID + "&seasonId=" + sID + " ");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(10000 /* milliseconds */);
        conn.setConnectTimeout(15000 /* milliseconds */);
        conn.setRequestMethod("GET");
        // Starts the query
        conn.connect();
    
        int response = conn.getResponseCode();
        Log.i("AndroidExample", "Response: " + response);
    
        if (response == 200)
        {
            String json = getJson(conn.getInputStream());
    
            JSONObject jsonObject = new JSONObject(json);
            JSONArray jsonArray = jsonObject.getJSONArray("rideStatistics");
    
            int reponame = 0;
            int rHeight = 0;
    
            for (int i = 0; i < jsonArray.length(); i++)
            {
                JSONObject skiRun = jsonArray.getJSONObject(i);
                reponame += skiRun.getInt("height");
    
                rHeight += skiRun.getInt("height");
                rideList.add(new Integer(rHeight));
                rHeight = 0;
            }
    
        }
    }
    catch (Exception e)
    {
        Log.i("AndroidExample", "Error");
    }
    finally
    {
    }
    
                                    return rideList;
                                }
    
                                @Override
                                protected void onPostExecute(List<Integer> list) 
    {
                                    super.onPostExecute(list);
                                    adapter.setList(rideList);
                                }
                            };
    
    }
    

    最后终于改变了 MainActivity 收件人:

    public class MainActivity extends AppCompatActivity {
    
    private ActivityMainViewModel viewmodel;
    RecyclerView recyclerView;
    MainAdapter mAdapter;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_main);
    
    ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    
    viewmodel = new ActivityMainViewModel();
    binding.setViewmodel(viewmodel);
    
    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    mAdapter = new MainAdapter(JsonData.rideList);
    
    recyclerView.setAdapter(mAdapter);
    new JsonData(mAdapter).downloadFromSkistar();
    }
    

    NetworkOnMainThread AsyncTask

        4
  •  0
  •   random1234    9 年前

    下面是我解决这个问题的方法,顺便说一句,我也在使用SwipeRefreshLayout。

    public class MainActivity extends AppCompatActivity {
    
    private ActivityMainViewModel viewmodel;
    RecyclerView recyclerView;
    MainAdapter mAdapter;
    public static ArrayList<Integer> rideList = new ArrayList<>();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
    
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    
        viewmodel = new ActivityMainViewModel();
        binding.setViewmodel(viewmodel);
    
        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        mAdapter = new MainAdapter(rideList);
        recyclerView.setAdapter(mAdapter);
    
        viewmodel.jdDownloadFromSkistar();
    
        final SwipeRefreshLayout swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipelayout);;
        swipeRefreshLayout.setColorSchemeResources(R.color.refresh,R.color.refresh1,R.color.refresh2);
    
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
    
                swipeRefreshLayout.setRefreshing(true);
    
                refreshRecyclerView();
    
                swipeRefreshLayout.setRefreshing(false);
            }
        });
    }
    
    private void refreshRecyclerView()
    {
        mAdapter.notifyDataSetChanged();
    }
    

    我所做的就是调用jdDownloadFromSkistar();方法,当我滑动以刷新时,它使用notifyDataSetChanged()更新适配器;方法