ArrayList未显示在RecyclerView中

时间:2017-07-26 10:25:58

标签: android arraylist android-recyclerview adapter

我试图在RecyclerView中显示Integers的ArrayList,从JSON下载ArrayList中的Integer值,所有这些都完成了,我需要帮助的是在RecyclerView中显示它们。

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

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

这是MainActivity的一部分:

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

}

row.xml:

<?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>

我知道它可能看起来很混乱,但那是因为我一直在google和youtube上搜索如何使用RecyclerView,所以我可能已经从不同的教程中混合并尝试过自己的事情。

谢谢!

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

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 个答案:

答案 0 :(得分:0)

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>

答案 1 :(得分:0)

你可以使用like ..

  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. 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>
    

答案 2 :(得分:0)

对于初学者,您没有在.htaccess课程中调用数据提取器方法。您的代码有点混乱,因此您可以尝试以下解决方案:

在适配器类中添加此方法:

JsonData

然后在你public void setList(ArrayList<Integer> rideList) { this.rideList = rideList; notifyDataSetChanged(); } 课程中添加:

JsonData

并将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

PS:你将获得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

中添加网络代码

答案 3 :(得分:0)

这是我为解决它所做的工作,而且我还使用了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()更新适配器;方法