2017-07-26 60 views
-4

我试图显示一个RecyclerView里面的Integers的ArrayList,ArrayList中的Integer值是从JSON下载的,所有完成的,我需要帮助的是显示它们在RecyclerView中。ArrayList不显示在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> 

我知道,它可能看起来一团糟,但是那是因为我一直对如何使用RecyclerView,所以我可能从不同的教程混合,并试图自己出头搜索都对谷歌和YouTube。

谢谢!

编辑:加入要求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(); 
} 
} 
+3

检查'JsonData.rideList'是否包含数据... –

+1

代码看起来不错..首先检查您的JSON数据是否存在。调试你的代码。把断点放在你试图解析数据的地方......检查结果 –

+0

JsonData.rideList在那一点似乎是空的,我如何让JsonData类先运行? – random1234

回答

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()更新适配器;方法。

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> 
+0

在第一代码部分的“上下文”和“donatesListAdapter”MainActivity是红色的。 – random1234

+0

编辑,再次测试plz – misagh

+0

ArrayList是空的,问题是它被填充到JsonData中,所以我需要它先运行或什么东西。 – random1234

0

您可以使用像..

  1. Model..to设定值,并获得价值

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

因为你不调用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至:

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

PS:你会得到NetworkOnMainThread异常。所以尝试添加网络代码AsyncTask

+0

RecyclerView仍然是空的=( – random1234

+0

您是否从url获得响应? –

+0

我现在用当前代码更新了这个问题,当我创建一个Integer的硬编码ArrayList时,这个当前代码已经工作了,这意味着现在唯一的问题是JsonData必须从OnCreate运行,因为ArrayList会被填充到JsonData中。真的会感谢一些帮助,不知道下一步该怎么做。 – random1234