Передать контекст активности фрагмента в пользовательский адаптер списка - PullRequest
0 голосов
/ 14 мая 2018

У меня есть настраиваемый адаптер списка, который мне нужно вызвать в моем фрагменте, но я не могу передать свою активность ему. У меня очень похожая настройка, но она вызывается изнутри действия, и она работает очень хорошо. Итак, я думаю, что проблема заключается в передаче контекста активности адаптеру, но я не уверен, как этого добиться.

Ниже приведен код для моего фрагмента, где я звоню на мой специальный адаптер:

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;


public class SiblingUnitFragment extends Fragment {

  Context siblingContext = this.getActivity();

  Activity context = this.getActivity();

  ProgressDialog progressDialog;

  ListView siblingLVAdapter;

  String ReadOnly;
  String LexaUser;
  String Password;
  String SearchValue;

  String finalResultSiblings;
  String HttpURLSiblings = "https://[myDataSpot]/getSiblings.php";
  HashMap<String, String> hashMapSiblings = new HashMap<>();
  HttpParse httpParse = new HttpParse();

  String[] Uuid;
  String[] Usize;
  String[] Ustatus;

  String SV;
  String[] svSeparated;

  ListView siblingListView;


  public SiblingUnitFragment() {
  }

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

    siblingListView = (ListView) view.findViewById(R.id.SiblingsList);

    return view;
  }

  public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);



    if (getArguments() != null) {
        SV = getArguments().getString("SearchValue");
        LexaUser = getArguments().getString("LexaUser");
    }

    if (SV.contains("-")) {

        svSeparated = SV.split("-");
        SearchValue = svSeparated[0];
        getSiblings(SearchValue, LexaUser);

    } else {
        SearchValue = SV;
        getSiblings(SearchValue, LexaUser);
    }
  }

  public void getSiblings(String searchInput, String lexaUser) {

    class SiblingsClass extends AsyncTask<String,Void,String> {

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

            progressDialog = ProgressDialog.show(siblingContext, "Loading Data", null, true, true);
        }

        @Override
        protected void onPostExecute(String httpResponseMsg) {

            super.onPostExecute(httpResponseMsg);

            if (httpResponseMsg != null) {

                try {

                    JSONArray json = new JSONArray(httpResponseMsg);

                    Uuid = new String[json.length()];
                    Usize = new String[json.length()];
                    Ustatus = new String[json.length()];

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

                        JSONObject object = json.getJSONObject(i);

                        Uuid[i] = object.getString("id");
                        Usize[i] = object.getString("size");
                        Ustatus[i] = object.getString("status");
                    }

                    siblingLVAdapter = new SiblingsListViewAdapter(context, Uuid, Usize, Ustatus);
                    siblingListView.setAdapter(siblingLVAdapter);


                } catch (JSONException e) {
                    Log.e("JSONException", "Error: " + e.toString());
                    Toast.makeText(siblingContext, "Error: " + e.toString(), Toast.LENGTH_LONG).show();
                } // catch (JSONException e)

                progressDialog.dismiss();

            } else {

                progressDialog.dismiss();
                Toast.makeText(siblingContext, "HttpResponseMsg is null.", Toast.LENGTH_LONG).show();
            }
        }

        @Override
        protected String doInBackground(String... params) {

            hashMapSiblings.put("searchinput", params[0]);
            hashMapSiblings.put("lexauser", params[1]);

            finalResultSiblings = httpParse.postRequest(hashMapSiblings, HttpURLSiblings);

            return finalResultSiblings;
        }
    }
    SiblingsClass siblingsClass = new SiblingsClass();
    siblingsClass.execute(searchInput, lexaUser);
  }
}

А это мой код для адаптера:

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class SiblingsListViewAdapter extends BaseAdapter {

  Activity context;
  String Uuid[];
  String Usize[];
  String Ustatus[];

  public SiblingsListViewAdapter(Activity context, String[] Uuid, String[] Usize, String[] Ustatus) {
    super();
    this.context = context;
    this.Uuid = Uuid;
    this.Usize = Usize;
    this.Ustatus = Ustatus;
  }

  public int getCount() {
    // TODO Auto-generated method stub
    return Uuid.length;
  }

  public Object getItem(int position) {
    // TODO Auto-generated method stub
    return null;
  }

  public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
  }

  private class ViewHolder {
    TextView txtViewUid;
    TextView txtViewSize;
    TextView txtViewStatus;
  }

  public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    ViewHolder holder;
    LayoutInflater inflater =  context.getLayoutInflater();

    if (convertView == null)
    {
        convertView = inflater.inflate(R.layout.siblings_list, null);
        holder = new ViewHolder();
        holder.txtViewUid = (TextView) convertView.findViewById(R.id.SiblingsUid);
        holder.txtViewSize = (TextView) convertView.findViewById(R.id.SiblingsSize);
        holder.txtViewStatus = (TextView) convertView.findViewById(R.id.SiblingsStatus);
        convertView.setTag(holder);
    }
    else
    {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.txtViewUid.setText(Uuid[position]);
    holder.txtViewSize.setText(Usize[position]);
    holder.txtViewStatus.setText(Ustatus[position]);

    return convertView;
  }
}

А вот ошибка logcat:

error: incompatible types: SiblingsListViewAdapter cannot be converted to ListView

Вся помощь приветствуется. Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

вы ошибаетесь в создании экземпляра вашего адаптера в строке 24.change ListView siblingLVAdapter; на SiblingsListViewAdapter siblingLVAdapter; и используете Context context =getActivity(); или Activity activity=getActivity(); в методе onAtach

0 голосов
/ 14 мая 2018

A за жизненный цикл фрагмента , вам нужно вызывать getContext только после вызова onAttach метода вашего жизненного цикла фрагмента, в противном случае нет связанной активности, следовательно, нет контекста

используйте его как

// declare context 
Context siblingContext ;

и инициализируйте

.. onCreateView(...){
    siblingContext = getContext(); 
    context  = getActvity();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...