2017-07-26 70 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