2017-12-16 9 views
1

RecyclerView에 데이터를 설정하려고합니다.데이터가 표시되지 않는 RecyclerView

여기는 응답 데이터입니다.

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

그것의 해석 및 ArrayList에 그것을 얻기 모두가 잘 작동되지만 재활용보기에 데이터가 표시되지 않습니다. 빈 화면. 여기

이 어댑터 활동

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

입니다 :

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

레이아웃 : ArrayList에 데이터를 가지고

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

반응이 좋아하지만, recyclerview doesnt 쇼 . 어떤 아이디어가 잘못 되었습니까?

답변

2

arrayListShops = new ArrayList<Shop>(Arrays.asList(shops));을 사용하는 경우 새 메모리 위치가 할당되고 주소는 arrayListShops으로 지정되지만 adapterShops은 이전 메모리 위치에 연결됩니다. 이런 이유로 adapterShops.notifyDataSetChanged()을 호출하면 이전 메모리 위치를 확인하고 목록을 새로 고칩니다. 그러나 새로 할당 된 메모리 위치에 데이터를 추가 했으므로 데이터가 표시되지 않습니다. 새 메모리를 할당하는 대신 오래된 메모리 위치에 데이터를 추가해야합니다. 내가 표시하기 위해 RecyclerView 및 해당 항목을 방지 코드에서 아무것도 보이지 않아요로

@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

나는 체크했다. 데이터가 있습니다. 어댑터 내부에서도 데이터가 적절합니다. 디버거가 어댑터의 OnBindViewHolder에서 settext 메서드로 두 번째로 이동하면 사라집니다. – Akshat

+0

프로젝트를 디버깅 및 테스트 할 수 있도록 공유 할 수 있습니까? –

+0

여기 있습니다. 나는 당신 편이 제대로 돌아 가지 않기를 바란다. https://www.dropbox.com/s/cyr67cvmlwkj31q/Saravana.zip?dl=0 – Akshat

0

일반적인 실수입니다. 먼저 init() 함수에서 어댑터를 빈 목록으로 설정해야합니다. 그런 다음 fetchShops() 메서드에서 데이터를 목록에 추가하고 adapterShops.notifyDataSetChanged()을 호출 한 후보기를 업데이트하십시오.

+0

. 그 방식으로도 작동하지 않습니다. setText 기능이 작동하는 동안 어댑터 내부의 문제가 발생합니다. – Akshat

0

아래에 getResponse 방법을 업데이트합니다. 또한 getResponse 콜백이 호출 될 때마다 ShopsAdapter의 새 인스턴스를 만드는 잘못된 방법으로 사용합니다. init 메소드 중 하나만 유지하고 요소 추가 및 제거 목록 인 arrayListShops 만 처리하십시오. 그러고 나서 adapterShops.notifyDataSetChanged() 방법으로 전화하는 것을 잊지 마십시오.

귀하의 주요 문제는 레이아웃에서 비롯된 것이라고 생각합니다. 이 레이아웃 다음 당신의 쇼핑 항목을 볼 수 :

값/styles.xml

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

레이아웃/activity_main.xml

를 귀하의 경우에는 더 나은 RelativeLayout를 사용합니다. LinearLayout을 사용했지만 중요 한 android:orientation="vertical" 속성을 놓쳤습니다.이 예에서는 화면에 항목이 표시되지 않습니다.

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

레이아웃/row_shop.xml I 시도

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