2017-12-16 7 views
1

Ich versuche, Daten zu einem RecyclerView festzulegen.RecyclerView zeigt keine Daten an

Hier sind die Antwortdaten.

[ 
    { 
"shopName": "Hello World.", 
"shopTeluguName": "మమ్మీ", 
"shopAddress": "Bomanahalli" 
}, 
    { 
"shopName": "Hello World.", 
"shopTeluguName": "మమ్మీ", 
"shopAddress": "Bomanahalli" 
}, 
    { 
"shopName": "Hello World.", 
"shopTeluguName": "మమ్మీ", 
"shopAddress": "Bomanahalli" 
}, 
    { 
"shopName": "Hello.", 
"shopTeluguName": "మమ్మీ", 
"shopAddress": "Bomanahalli" 
} 
] 

Sein Parsing und bekommen es in Arraylist alle arbeiten gut, aber die Recycler Ansicht zeigt, keine Daten. Leerer Bildschirm

Hier ist die Aktivität

public class MainActivity extends AppCompatActivity implements WebServiceInterface { 

    Toolbar toolbar; 
    RecyclerView recyclerViewShops; 
    private int FETCH_SHOPS_REQUEST_CODE = 1; 
    ArrayList<Shop> arrayListShops; 
    ShopsAdapter adapterShops; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     init(); 

     fetchShops(); 
    } 

    private void init() { 

     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setTitle("Shops List"); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(false); 
     getSupportActionBar().setDisplayShowHomeEnabled(false); 
     toolbar.setTitleTextColor(Color.WHITE); 

     recyclerViewShops = (RecyclerView) findViewById(R.id.recyclerView); 
     RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this); 
     recyclerViewShops.setLayoutManager(mLayoutManager); 
     recyclerViewShops.setItemAnimator(new DefaultItemAnimator()); 
     recyclerViewShops.setHasFixedSize(true); 

     arrayListShops = new ArrayList<>(); 

    } 

    private void fetchShops() { 

     HashMap<String, String> paramsList = new HashMap<>(); 

     WebServiceController webServiceController = new WebServiceController(
       this, this); 
     String hitURL = LinksAndKeys.SHOPS_URL; 
     webServiceController.sendGETRequest("", "Loading..", hitURL, paramsList, FETCH_SHOPS_REQUEST_CODE); 

    } 

    @Override 
    public void getResponse(int responseCode, String responseString, String requestType, int requestCode) { 
     if (requestCode == FETCH_SHOPS_REQUEST_CODE && responseCode == 200) { 

      Gson gson = new Gson(); 
      Shop[] shops = gson.fromJson(responseString, Shop[].class); 
      arrayListShops = new ArrayList<Shop>(Arrays.asList(shops)); 

      adapterShops = new ShopsAdapter(this, arrayListShops); 
      recyclerViewShops.setAdapter(adapterShops); 
     } 
    } 
} 

Hier wird der Adapter:

public class ShopsAdapter extends RecyclerView.Adapter<ShopsAdapter.MyViewHolder> { 

    Activity activity; 
    private List<Shop> shopList; 

    public class MyViewHolder extends RecyclerView.ViewHolder { 
     LinearLayout linearLayoutParent; 
     public TextView textViewShopName, textViewShopTeluguName, textViewShopAddress; 

     public MyViewHolder(View view) { 
      super(view); 
      linearLayoutParent = (LinearLayout) view.findViewById(R.id.linearLayoutParent); 
      textViewShopName = (TextView) view.findViewById(R.id.textViewShopName); 
      textViewShopTeluguName = (TextView) view.findViewById(R.id.textViewShopTeluguName); 
      textViewShopAddress = (TextView) view.findViewById(R.id.textViewShopAddress); 
     } 
    } 


    public ShopsAdapter(Activity activity, List<Shop> shopList) { 
     this.activity = activity; 
     this.shopList = shopList; 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.row_shop, parent, false); 

     return new MyViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
     final Shop shop = shopList.get(position); 

     holder.textViewShopName.setText(shop.getShopName()); 
     holder.textViewShopTeluguName.setText(shop.getShopTeluguName()); 
     holder.textViewShopAddress.setText(shop.getShopAddress()); 

     holder.linearLayoutParent.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Toast.makeText(activity, shop.getShopName(), Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 

    @Override 
    public int getItemCount() { 
     return shopList.size(); 
    } 
} 

Layout:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.saravanaeggdistributors.activities.MainActivity"> 

    <include 
     android:id="@+id/toolbar" 
     layout="@layout/toolbar" /> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:scrollbars="vertical" /> 

</LinearLayout> 

Die Antwort ist in Ordnung, Arraylist die Daten hat, aber RecyclerView wird nicht angezeigt . Irgendeine Idee, die hier falsch ist.?

Antwort

2

Wenn Sie arrayListShops = new ArrayList<Shop>(Arrays.asList(shops)); verwenden, wird ein neuer Speicherort zugewiesen und die Adresse wird in arrayListShops zugewiesen, aber Ihr adapterShops ist mit dem alten Speicherort verbunden. Aus diesem Grund wird beim Aufruf von adapterShops.notifyDataSetChanged() der alte Speicherort überprüft und die Liste aktualisiert. Sie haben jedoch die Daten im neu zugewiesenen Speicherort hinzugefügt, sodass die Daten nicht angezeigt werden. Sie müssen Daten an alten Speicherort hinzufügen, anstatt neuen Speicher zuzuweisen. Aktualisieren Sie Ihre getResponse Methode wie unten

@Override 
public void getResponse(int responseCode, String responseString, String requestType, int requestCode) { 
    if (requestCode == FETCH_SHOPS_REQUEST_CODE && responseCode == 200) { 

     Gson gson = new Gson(); 
     Shop[] shops = gson.fromJson(responseString, Shop[].class); 
     ArrayList<Shop> tmp = new ArrayList<>(Arrays.asList(shops)); 
     arrayListShops.addAll(tmp); 
     Toast.makeText(this, arrayListShops.size() + " Shops", Toast.LENGTH_SHORT).show(); 
     adapterShops.notifyDataSetChanged(); 
    } 
} 
+0

Ich habe überprüft. Die Daten sind da. Sogar innerhalb des Adapters sind Daten richtig. Wenn der Debugger zum zweiten Mal zur settext-Methode in OnBindViewHolder im Adapter wechselt, verschwindet er. – Akshat

+0

Können Sie das Projekt freigeben, damit ich es debuggen und testen kann? –

+0

Hier ist es. Ich hoffe es läuft nicht richtig auf deiner Seite.! https://www.dropbox.com/s/cyr67cvmlwkj31q/Saravana.zip?dl=0 – Akshat

0

Allgemeiner Fehler. Sie müssen den Adapter in Ihrer init() Funktion mit der leeren Liste zuerst einstellen. Dann fügen Sie in der fetchShops() Methode die Daten zur Liste hinzu und rufen Sie danach adapterShops.notifyDataSetChanged() auf, um die Ansicht zu aktualisieren.

+0

, dass ich versucht. Es funktioniert auch nicht so. Das Problem tritt irgendwo innerhalb des Adapters während der setText-Funktion auf. – Akshat

0

Ich bin nicht alles in Ihrem Code zu sehen, dass Ihre RecyclerView und seine Elemente verhindert zu zeigen. Darüber hinaus verwenden Sie es in einer falschen Weise, neue Instanzen von ShopsAdapter jedes Mal, wenn getResponse Callback aufgerufen wird. Halten Sie einfach die eine der init Methode und nur behandeln arrayListShops Liste Hinzufügen und Entfernen von Elementen. Vergessen Sie nicht, danach die adapterShops.notifyDataSetChanged() Methode aufzurufen.

Ich denke, dass Ihr Hauptproblem von Ihren Layouts kommt.

Werte/styles.xml

<resources> 
    <!-- Base application theme. --> 
    <style name="AppTheme" parent="Theme.AppCompat.Light" /> 
</resources> 

Layout/activity_main.xml

In Ihrem Fall besser RelativeLayout verwenden: Sie sollten Ihren Shop-Artikel im Anschluss an diesen Layouts sehen. Sie haben LinearLayout verwendet, aber Sie haben die wichtige android:orientation="vertical" Eigenschaft verpasst, die Ihre Artikel auf dem Bildschirm in Ihrem Beispiel sicher nicht zeigen würde.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    > 

    <include 
     android:id="@+id/toolbar" 
     layout="@layout/toolbar" /> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:scrollbars="vertical" /> 

</RelativeLayout> 

Layout/row_shop.xml

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/linearLayoutParent" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@android:color/holo_orange_dark" 
    android:gravity="center_vertical" 
    android:orientation="horizontal" 
    > 

    <TextView 
     android:id="@+id/textViewShopName" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     /> 

    <TextView 
     android:id="@+id/textViewShopTeluguName" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     /> 

    <TextView 
     android:id="@+id/textViewShopAddress" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     /> 


</LinearLayout>