【问题标题】:Contexts of Fragments片段的上下文
【发布时间】:2016-10-19 16:32:48
【问题描述】:

我正在处理一个游乐园记录信息,其中我制作了一个从 MySQL 数据库加载数据的 recyclerview。 Recyclerview 包含在一个片段中。以下是我的主要活动代码:

public class TicketSoldFragment extends Fragment {

    Button press;
    String url="http://10.0.2.2/data/ticketsold_show_swing.php";

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

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        final RecyclerView rv=(RecyclerView)view.findViewById(R.id.recyclerview_ticketsold);
        rv.setLayoutManager(new LinearLayoutManager(getContext()));
        rv.setItemAnimator(new DefaultItemAnimator());
        Context c=getActivity().getApplicationContext();

        press=(Button)view.findViewById(R.id.buttonplease);

        press.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Downloader d=new Downloader(getActivity().getApplicationContext(),url,rv);
                d.execute();
            }
        });
    }
}

这是我的下载器代码:

public class Downloader extends AsyncTask<Void,Integer,String> {

    Context c;
    String stringURL;
    RecyclerView rv;
    ProgressDialog pd;

    public Downloader(Context c, String stringURL, RecyclerView rv) {
        this.c= c;
        this.stringURL = stringURL;
        this.rv = rv;
    }

    @Override
    protected String doInBackground(Void... params) {
        String data=this.downloadData();
        return data;
    }

    @Override
    protected void onPostExecute(String data) {
        super.onPostExecute(data);

        pd.dismiss();
        if(data!=null) {
            Parser p=new Parser(c,data,rv);
            p.execute();
        }
        else {
            Toast.makeText(c,"Unable to download",Toast.LENGTH_SHORT).show();
        }
    }

    private String downloadData() {
        InputStream is=null;
        String line=null;
        try {
            URL url=new URL(stringURL);
            HttpURLConnection con= (HttpURLConnection) url.openConnection();
            is=new BufferedInputStream(con.getInputStream());

            BufferedReader br=new BufferedReader(new InputStreamReader(is));
            StringBuffer sb=new StringBuffer();

            if(br!=null) {
                while((line=br.readLine())!=null) {
                    sb.append(line+"\n");

                }
            }
            else {
                return null;
            }
            return sb.toString();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            if(is!=null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return null;
    }


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pd=new ProgressDialog(c);
        pd.setTitle("Download Data");
        pd.setMessage("Downloading...Please Wait!");
        pd.show();
    }
}

这是我的解析器:

public class Parser extends AsyncTask<Void,Integer,Integer> {

    Context c;
    String data;
    RecyclerView rv;

    ProgressDialog pd;
    ArrayList<String> swings=new ArrayList<>();
    MyAdapter adapter;

    public Parser(Context c, String data, RecyclerView rv) {
        this.c = c;
        this.data = data;
        this.rv = rv;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        pd=new ProgressDialog(c);
        pd.setTitle("Parse Data");
        pd.setMessage("Parsing...Please wait!");
        pd.show();
    }

    @Override
    protected Integer doInBackground(Void... params) {
        return this.parse();
    }

    @Override
    protected void onPostExecute(Integer integer) {
        super.onPostExecute(integer);

        pd.dismiss();

        if(integer==1) {
            adapter=new MyAdapter(c,swings);
            rv.setAdapter(adapter   );
        }
        else {
            Toast.makeText(c,"Unable to parse data",Toast.LENGTH_SHORT).show();
        }
    }

    private int parse() {
        try {
            JSONArray ja=new JSONArray(data);
            JSONObject jo=null;
            swings.clear();

            for(int i=0;i<ja.length();i++) {
                jo=ja.getJSONObject(i);
                String name=jo.getString("name");
                swings.add(name);
            }
            return 1;

        } catch (JSONException e) {
            e.printStackTrace();
        }
        return 0;
    }
}

现在的问题是,当我将 Fragment 上下文从 TicketSoldFragment 发送到 Downloader 构造函数时,出现错误,我无法弄清楚。

这是我的适配器:

public class MyAdapter extends RecyclerView.Adapter<MyHolder> {
    Context c;
    ArrayList<String> swings;

    public MyAdapter(Context c,ArrayList<String>swings){
        this.c=c;
        this.swings=swings;
    }

    @Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.card_ticketsold,parent,false);
        MyHolder holder=new MyHolder(v);

        return holder;
    }

    @Override
    public void onBindViewHolder(MyHolder holder, int position) {
        holder.nameTxt.setText(swings.get(position));
        holder.setItemClickListener(new ItemClickListener() {
            @Override
            public void onItemClick(int pos) {
                Toast.makeText(c,swings.get(pos),Toast.LENGTH_SHORT).show();
            }
        });

    }

    @Override
    public int getItemCount() {
        return swings.size();
    }
}

和我的持有人:

public class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView nameTxt;
    ItemClickListener itemClickListener;

    public MyHolder(View itemView) {
        super(itemView);

        nameTxt= (TextView) itemView.findViewById(R.id.swing_name_ticket_sold_text);

        itemView.setOnClickListener(this);
    }


    public void setItemClickListener(ItemClickListener ic)
    {
        this.itemClickListener=ic;
    }

    @Override
    public void onClick(View v) {
        this.itemClickListener.onItemClick(getLayoutPosition());
    }
}

【问题讨论】:

  • 你得到什么错误?
  • 错误是屏幕无法加载,实际上是上下文错误。

标签: android mysql android-fragments


【解决方案1】:

在不知道你得到的错误的情况下,我可以假设它与 getApplicationContext() 有关 - getActivity() 是正确的上下文,所以它应该是

Downloader d = new Downloader(getActivity(), url, rv);

应用程序上下文可用于数据访问,但不能用于 UI,您正在代码中执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2016-08-19
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    相关资源
    最近更新 更多