簡體   English   中英

在Android的RecyclerView中加載數據時不隱藏布局

[英]Not hide layout when load data in RecyclerView on Android

我想為一個網站開發應用程序,並希望將網站帖子加載到RecyclerView 我要顯示應用程序中第一個條目的加載布局,並且當加載將數據發布到RecyclerView隱藏此布局並顯示 RecyclerView
我寫了這段代碼,但是對我來說不起作用,並且總是顯示emptyLayout
主要活動XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/appBackground"
    tools:context=".Activities.Main_page">

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

    <android.support.v7.widget.RecyclerView
        android:id="@+id/main_recycler"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/main_toolbar" />

    <RelativeLayout
        android:id="@+id/main_empty_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone">

        <include layout="@layout/empty_page_layout" />

    </RelativeLayout>

</RelativeLayout>

MainActivity java:

public class Main_page extends AppCompatActivity {

    private static final long RIPPLE_DURATION = 250;
    private Toolbar toolbar;
    private RelativeLayout root;
    private ImageView menu_image;
    private RecyclerView main_recyclerView;
    private MainAdapter mAdaper;
    private List<MainDataModel> dataModels = new ArrayList<MainDataModel>();
    private List<MainDataModel> dataModelsArray;
    private Context context;
    protected Handler handler;
    private RelativeLayout loadLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_page);
        if (!EventBus.getDefault().isRegistered(this)) {
            EventBus.getDefault().register(this);
        }
        handler = new Handler();
        context = getApplicationContext();
        loadLayout = (RelativeLayout) findViewById(R.id.main_empty_layout);
        toolbar = (Toolbar) findViewById(R.id.main_toolbar);
        if (toolbar != null) {
            setSupportActionBar(toolbar);
            getSupportActionBar().setTitle(null);
        }
        LoadData();
        // Menu
        root = (RelativeLayout) findViewById(R.id.main_root);
        View guillotineMenu = LayoutInflater.from(this).inflate(R.layout.menu_layout, null);
        root.addView(guillotineMenu);
        menu_image = (ImageView) toolbar.findViewById(R.id.toolbar_logo);
        new GuillotineAnimation.GuillotineBuilder(guillotineMenu, guillotineMenu.findViewById(R.id.menu_layout_image), menu_image)
                .setStartDelay(RIPPLE_DURATION)
                .setActionBarViewForAnimation(toolbar)
                .setClosedOnStart(true)
                .build();
        // RecyclerView and setData
        main_recyclerView = (RecyclerView) findViewById(R.id.main_recycler);
        main_recyclerView.setHasFixedSize(true);
        main_recyclerView.setLayoutManager(new LinearLayoutManager(this));
        mAdaper = new MainAdapter(this, dataModels);
        main_recyclerView.setAdapter(mAdaper);

        if (dataModels.isEmpty()) {
            main_recyclerView.setVisibility(View.GONE);
            loadLayout.setVisibility(View.VISIBLE);

        } else {
            main_recyclerView.setVisibility(View.VISIBLE);
            loadLayout.setVisibility(View.GONE);
        }

    }

    @Subscribe
    public void onEvent(List<MainDataModel> mainInfoModels) {
        mAdaper.add(mainInfoModels);
    }

    private void LoadData() {
        final MainDataInfo dataInfo = new MainDataInfo();
        dataInfo.getMainDataInfo(this);
    }
}

AsyncTask代碼:

public class MainDataInfo {
    private Context mContext;

    public void getMainDataInfo(Context context) {
        mContext = context;
        new getInfo().execute(ServerIP.getIP());
    }

    private class getInfo extends AsyncTask<String, Void, String> {
        EventBus bus = EventBus.getDefault();
        private String ou_response;
        private List<MainDataModel> infoModels;

        @Override
        protected void onPreExecute() {
            CustomProcessDialog.createAndShow(mContext);
            infoModels = new ArrayList<>();
        }

        @Override
        protected String doInBackground(String... params) {
            OkHttpClient client = new OkHttpClient();

            Request request = new Request.Builder()
                    .url(ServerIP.getIP())
                    .build();

            Response response;
            try {
                response = client.newCall(request).execute();
                ou_response = response.body().string();
                response.body().close();
                if (ou_response != null) {
                    try {
                        JSONObject postObj = new JSONObject(ou_response);
                        JSONArray postsArray = postObj.getJSONArray("posts");
                        infoModels = new ArrayList<>();

                        for (int i = 0; i <= infoModels.size(); i++) {
                            JSONObject postObject = (JSONObject) postsArray.get(i);
                            int id = postObject.getInt("id");
                            String title = postObject.getString("title");
                            Log.d("Data", "Post id: " + id);
                            Log.d("Data", "Post title: " + title);

                            //Use the title and id as per your requirement
                            infoModels.add(new MainDataModel(
                                    postObject.getInt("id"),
                                    postObject.getString("title"),
                                    postObject.getString("content"),
                                    postObject.getString("thumbnail")));
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return ou_response;
        }

        @Override
        protected void onPostExecute(String result) {
            CustomProcessDialog.dissmis();
            if (result != null) {
                bus.post(infoModels);
            }
        }
    }
}

mainActivity刪除emptyLayout時, RecyclerView 顯示所有帖子 當插入此布局( emptyLayout )時, recyclerView 可見,並且EmptyLayout 不消失

我該如何解決這個問題? tnx全部<3

我想您不會在合適的地方打電話,因為dataModels總是空的。

實際上,僅在加載數據的AsyncTask的onPostExecute()方法之后才需要進行調用。

您可以使用接口(下面的示例中為AsyncResponse)來捕獲AyncTask進程的結束。

在這里AynscResponse:

public interface AsyncResponse {
    void endTask(List<MainDataModel> dataModels);
}

在您的AsyncTask中:

private AsyncResponse listener;

     @Override
        protected void onPostExecute(List<MainDataModel> dataModels) {
            listener.processFinish(dataModels);
        }

最后在您的活動中:

    // Set by default the visibility
    main_recyclerView.setVisibility(View.GONE);
    loadLayout.setVisibility(View.VISIBLE);

    public void processFinish(List<MainDataModel> dataModels) {
         if (dataModels.isEmpty()) {
              // Handle error with an empty list
         } else {
              main_recyclerView.setVisibility(View.VISIBLE);
              loadLayout.setVisibility(View.GONE);
         }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM