没有适配器使用片段在recyclerview中附加跳过布局

时间:2017-01-05 04:02:15

标签: android android-layout android-fragments

我在使用片段的回收站视图中出错了。我已经阅读了stackoverflow的答案,但它没有解决。请帮我。

Recycler参考教程 http://www.android-examples.com/android-recyclerview-listview-with-imageview-textview-json/

当我在没有片段的情况下使用时,它可以正常工作但在片段中它显示错误。 我的代码如下所示。

FriendsFragment.java

public class FriendsFragment extends android.support.v4.app.Fragment {


List<GetDataAdapter> GetDataAdapter1;

RecyclerView recyclerView;

RecyclerView.LayoutManager recyclerViewlayoutManager;

RecyclerView.Adapter recyclerViewadapter;

String GET_JSON_DATA_HTTP_URL = "http://192.168.43.7/work/ecom/2/1.php";
String JSON_IMAGE_TITLE_NAME = "image_title";
String JSON_IMAGE_URL = "image_url";

JsonArrayRequest jsonArrayRequest ;

RequestQueue requestQueue ;

public FriendsFragment() {
    // Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_friends, container, false);

    GetDataAdapter1 = new ArrayList<>();
    recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerview1);
    recyclerView.setHasFixedSize(true);
    recyclerViewlayoutManager = new LinearLayoutManager(getContext());
    recyclerView.setLayoutManager(recyclerViewlayoutManager);

    JSON_DATA_WEB_CALL();



    // Inflate the layout for this fragment
    return rootView;
}

public void JSON_DATA_WEB_CALL(){

    jsonArrayRequest = new JsonArrayRequest(GET_JSON_DATA_HTTP_URL,

            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {

                    Log.d("LOGTAG", "Response :"+response);

                    JSON_PARSE_DATA_AFTER_WEBCALL(response);
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {

                }
            });

    requestQueue = Volley.newRequestQueue(getContext());

    requestQueue.add(jsonArrayRequest);
}


public void JSON_PARSE_DATA_AFTER_WEBCALL(JSONArray array){

    for(int i = 0; i<array.length(); i++) {

        GetDataAdapter GetDataAdapter2 = new GetDataAdapter();

        JSONObject json = null;
        try {

            json = array.getJSONObject(i);

            GetDataAdapter2.setImageTitleNamee(json.getString(JSON_IMAGE_TITLE_NAME));

            GetDataAdapter2.setImageServerUrl(json.getString(JSON_IMAGE_URL));

        } catch (JSONException e) {

            e.printStackTrace();
        }
        GetDataAdapter1.add(GetDataAdapter2);
    }

    recyclerViewadapter = new RecyclerViewAdapter(GetDataAdapter1, getContext());

    recyclerView.setAdapter(recyclerViewadapter);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
}

@Override
public void onDetach() {
    super.onDetach();
}
}


RecyclerViewAdapter.java

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
Context context;
List<GetDataAdapter> getDataAdapter;
ImageLoader imageLoader1;
public RecyclerViewAdapter(List<GetDataAdapter> getDataAdapter, Context context){

    super();
    this.getDataAdapter = getDataAdapter;
    this.context = context;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_items, parent, false);

    ViewHolder viewHolder = new ViewHolder(v);

    return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder Viewholder, int position) {

    GetDataAdapter getDataAdapter1 =  getDataAdapter.get(position);

    imageLoader1 = ServerImageParseAdapter.getInstance(context).getImageLoader();

    imageLoader1.get(getDataAdapter1.getImageServerUrl(),
            ImageLoader.getImageListener(
                    Viewholder.networkImageView,//Server Image
                    R.mipmap.ic_launcher,//Before loading server image the default showing image.
                    android.R.drawable.ic_dialog_alert //Error image if requested image dose not found on server.
            )
    );

Viewholder.networkImageView.setImageUrl(getDataAdapter1.getImageServerUrl(), imageLoader1);

 Viewholder.ImageTitleNameView.setText(getDataAdapter1.getImageTitleName());

}

@Override
public int getItemCount() {

    return getDataAdapter.size();
}

class ViewHolder extends RecyclerView.ViewHolder{

    public TextView ImageTitleNameView;
    public NetworkImageView networkImageView ;

    public ViewHolder(View itemView) {

        super(itemView);

        ImageTitleNameView = (TextView) itemView.findViewById(R.id.textView_item) ;

        networkImageView = (NetworkImageView) itemView.findViewById(R.id.VollyNetworkImageView1) ;

    }
}
}

fragment_friends.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.ecom.fragment2.FriendsFragment">

<android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerview1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

</RelativeLayout>



recyclerview_items.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/cardview1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardElevation="3dp"
card_view:contentPadding="3dp"
card_view:cardCornerRadius="3dp"
card_view:cardMaxElevation="3dp"
>


<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <com.android.volley.toolbox.NetworkImageView
        android:id="@+id/VollyNetworkImageView1"
        android:layout_width="150dp"
        android:layout_height="100dp"
        android:src="@mipmap/ic_launcher"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Image Name"
        android:id="@+id/textView_item"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@+id/VollyNetworkImageView1"
        android:layout_toEndOf="@+id/VollyNetworkImageView1"
        android:layout_marginLeft="20dp"/>

</RelativeLayout>

</android.support.v7.widget.CardView>

2 个答案:

答案 0 :(得分:0)

您应该制作自定义线性布局管理器。有时会出现一种情况:如果您快速滚动,那么您在recycleView中会导致异常。要避免此问题,您必须实现自定义布局管理器,如下所示:

public class CustomLinearLayoutManager extends LinearLayoutManager {
private Context mContext;

public CustomLinearLayoutManager(Context context, int orientation,boolean reverseLayout){
    super(context, orientation, reverseLayout);
    mContext=context;
}

@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
    try {
        super.onLayoutChildren(recycler, state);
    } catch (Exception e) {
        Constants.errorLog("onLayoutChildren :" , e.toString());
    }
}

}

现在在您的recycleview中使用此布局管理器,如下所示:

    LinearLayoutManager recyclerViewlayoutManager = new CustomLinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
    recyclerView.setLayoutManager(recyclerViewlayoutManager );

希望你现在能避免我提到的例外。

答案 1 :(得分:0)

问题是在清单文件中添加权限。

添加

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

工作正常。