如何在点击时将数据更新到recylerview

问题描述 投票:0回答:2

我正在开发一个应用程序,其中我获取JSON数据,我在recylcer视图中显示它。现在点击回收站视图,根据点击的项目,我需要从服务器获取JSON数据并将其显示在同一个回收站视图中。它的递归功能。我找不到任何东西。

MainActivity中,我创建了一个用于执行网络任务的内部类

new LauncherLoadThread(rootView).execute(appUsername, appPassword, loadURL,   path);

class LauncherLoadThread extends AsyncTask<String, Integer, String[]> {

    private View rootView;

    public LauncherLoadThread(View rootView) {
        this.rootView = rootView;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressBar.setVisibility(View.VISIBLE);
    }

    @Override
    protected void onPostExecute(String[] strings) {
        super.onPostExecute(strings);
        progressBar.setVisibility(View.GONE);
        if (strings != null) {
            if (strings[0].contentEquals("200")) {
                try {
                    String data = strings[1];
                    Log.d("Data", data);
                    JSONArray allData = new JSONArray(data);

                    for (int i = 0; i < allData.length(); i++) {
                        JSONObject jsonObject = allData.getJSONObject(i);
                        String id = jsonObject.getString("id");
                        String name = jsonObject.getString("name");
                        String path = jsonObject.getString("path");
                        String leaf = jsonObject.getString("leaf");
                        Log.d("Loaded Data: ", "Id: " + id + ". name: " + name + ". Path: " + path);
                        LauncherModel launcherModel=new LauncherModel(id,name,leaf,path);
                        launcherModelList.add(launcherModel);
                    }

                    adapter=new LauncherAdapter(launcherModelList,getContext());
                    launcherRecyclerView.setAdapter(adapter);

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            } else {
                Snackbar snackbar = Snackbar.make(rootView, strings[0] + " Something broke down.", Snackbar.LENGTH_LONG);
                View snackBarView = snackbar.getView();
                TextView tv = (TextView) snackBarView.findViewById(android.support.design.R.id.snackbar_text);
                snackbar.show();
            }
        } else {
            Snackbar snackbar = Snackbar.make(rootView, "Oops something went wrong.", Snackbar.LENGTH_LONG);
            View snackBarView = snackbar.getView();
            TextView tv = (TextView) snackBarView.findViewById(android.support.design.R.id.snackbar_text);
            snackbar.show();
        }
    }

    @Override
    protected String[] doInBackground(String... strings) {
        String username = strings[0];
        String password = strings[1];
        String url = strings[2];
        String path=strings[3];
        String processURL="";
        if(path.equals("")) {
            processURL=url+"?path=Library";
        }else {
            processURL=url+"?path=" + path;
        }
        Log.d("doInBackURL", url);

        String credential = Credentials.basic(username, password);
        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
                .url(url)
                .get()

                .addHeader("authorization", credential)
                .addHeader("content-type", "application/json")

                .build();

        try {
            Response response = client.newCall(request).execute();
            if (response.isSuccessful()) {
                String body = response.body().string();

                Log.d("Body--->",body);
                String code = response.code() + "";
                Log.d("Code--->",code);
                String[] output = {code, body};
                return output;
            } else {
                String body = "Error: 404";
                String code = response.code() + "";
                String[] output = {code, body};
                return output;
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

}

这是我的适配器onClickMethod

public void onBindViewHolder(LauncherViewHolder holder, int position) {
    LauncherModel launcherModel = listItem.get(position);
    .......
    .......
    .......
    .......
    .......
    .......

    holder.launcherItemRelativeLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

        }
    });
}
java android android-recyclerview recycler-adapter
2个回答
0
投票

您只需调用Adapter类的notifyDataSetChanged()函数即可。


1
投票

根据您使用的架构,这里有很多选项。基本上,你可以创建像MyCustomItemClickListener这样的界面:

interface MyCustomItemClickListener {
    void onClick();
}

比你通过与RecyclerView相关的MyCustomItemClickListener扩展Activity并覆盖它的方法:

@Override
public void onClick(){
    // basically, here goes the logic you want on click
}

我假设你已经在ViewHolder中有Adapter,简单的选择是在你的`适配器中将Activity作为自定义Listener传递。比如果我们选择这个选项,它应该像这样工作:

//adapter's inner
class SomeClassViewHolder(val view: View) extends RecyclerView.ViewHolder(view) {
    //here can be view initializing, like
    txtHeader = (TextView) view.findViewById(R.id.audio_subtitle);

    void bind(int position){
        // all view binding logic goes here, for example:
        txtHeader.setText("someText");

        // AND here is also your listener working:
        view.setOnClickListener{
            listener.onItemClick(item)
        }
    }
}

//and then in adapter
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        holder.bind(values.get(position));
}

这里唯一的技巧是将视图(Activity或Fragment)作为侦听器传递给自定义适配器,它应该可以工作。

编辑:当然,使用这种方法,您只需使用自己的逻辑从活动中重新加载数据,例如发出另一个异步请求。

© www.soinside.com 2019 - 2024. All rights reserved.