繁体   English   中英

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

[英]How to update data to recylerview on click

我正在开发一个应用程序,其中获取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) {

        }
    });
}

在这里,根据您使用的体系结构,您有很多选择。 基本上,您可以创建类似MyCustomItemClickListener界面:

interface MyCustomItemClickListener {
    void onClick();
}

比您通过与RecyclerView相关的Activity扩展MyCustomItemClickListener并重写其方法:

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

因为我假设您已经在Adapter拥有ViewHolder ,所以简单的选择就是将Activity作为自定义Listener传递给您的Adapter。 比起,如果我们选择这个选项,它应该像这样工作:

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

唯一的技巧是将视图(活动性或片段)作为侦听器传递给自定义适配器,它应该可以工作。

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

您可以简单地调用Adapter类的notifyDataSetChanged()函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM