如何将片段之间的数据传递给适配器
how can pass data between fragment to adapter
查看关于此的所有 post 并理解在所有情况下人们解释如何使用接口将数据从适配器传递到片段,我使用它但我的问题是如何将数据从片段传递到适配器?以及如何传递这些数据的价值?
这是我的适配器:
public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> {
private Context context;
List<jsonContent> jcontent;
private AdapterCallback callback;
private String etpass;
public DataAdapter(Context context, List<jsonContent> jcontent, AdapterCallback callback) {
this.context=context;
this.jcontent=jcontent;
this.callback=callback;
}
@Override
public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view ;
if(i == R.layout.card_row) {
view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_row, viewGroup, false);
}else {
view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.button_card, viewGroup, false);
}
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int i) {
if(i == jcontent.size()) {
viewHolder.buttonnext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
jcontent.removeAll(jcontent);
callback.MethodCallbacknext();
}
});
viewHolder.buttonprev.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
jcontent.removeAll(jcontent);
callback.MethodCallbackprev();
}
});
viewHolder.go.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
etpass=String.valueOf(viewHolder.editText.getText());
maghalat f1 = new maghalat ();
Bundle args1 = new Bundle();
args1.putString("sag",etpass);
f1.setArguments(args1);
callback.MethodCallbackgo();
}
});
viewHolder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
viewHolder.pages.setText(Integer.toString(jcontent.get(i - 1).pages));
}
else {
viewHolder.title.setText(jcontent.get(i).title);
viewHolder.title.setTypeface(viewHolder.title.getTypeface(), Typeface.BOLD);
Picasso.with(context).load(jcontent.get(i).imgurl).resize(300, 400).into(viewHolder.imageView);
}
}
@Override
public int getItemCount() {
return jcontent.size()+1;
}
@Override
public int getItemViewType(int position) {
return (position == jcontent.size()) ? R.layout.button_card : R.layout.card_row;
}
public class ViewHolder extends RecyclerView.ViewHolder{
private TextView title,pages,current;
private ImageView imageView;
private Button buttonnext,buttonprev,go;
private CardView cardView;
private EditText editText;
public ViewHolder(final View view) {
super(view);
title = (TextView)view.findViewById(R.id.post_title);
imageView=(ImageView)view.findViewById(R.id.img);
buttonnext =(Button)view.findViewById(R.id.next);
buttonprev=(Button)view.findViewById(R.id.prev);
go=(Button)view.findViewById(R.id.go);
editText=(EditText)view.findViewById(R.id.et_go_page);
cardView=(CardView)view.findViewById(R.id.cvv);
pages=(TextView)view.findViewById(R.id.number_pages);
current=(TextView)view.findViewById(R.id.current);
}
}
}
这是我的界面:
public interface AdapterCallback {
void MethodCallbackgo();
void MethodCallbacknext();
void MethodCallbackprev();
}
这是我的片段:
public class maghalat extends Fragment {
private View myFragmentView;
private RecyclerView recyclerView;
private DataAdapter adapter;
private String TAG = MainActivity.class.getSimpleName();
private ProgressDialog pDialog;
List<jsonContent> listcontent=new ArrayList<>();
public int dog=1;
public String url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_posts";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
myFragmentView = inflater.inflate(R.layout.maghalat, container, false);
if(isNetworkConnected()) {
asyncRun();
}else
{
Toast.makeText(getActivity().getApplicationContext(), "دستگاه شما به اینترنت متصل نیست!", Toast.LENGTH_LONG).show();
}
return myFragmentView;
}
public void asyncRun(){
new GetContacts().execute();
}
public class GetContacts extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// Showing progress dialog
pDialog = new ProgressDialog(getActivity());
pDialog.setMessage("Please wait...");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected Void doInBackground(Void... arg0) {
HttpHandler sh = new HttpHandler();
// Making a request to url and getting response
String jsonStr = sh.makeServiceCall(url);
Log.e(TAG, "Response from url: " + jsonStr);
if (jsonStr != null) {
try {
JSONObject jsonObj = new JSONObject(jsonStr);
int id=jsonObj.getInt("pages");
JSONArray posts = jsonObj.getJSONArray("posts");
for (int i = 0; i < posts.length(); i++) {
JSONObject c = posts.getJSONObject(i);
jsonContent jsonContent=new jsonContent();
jsonContent.title=c.getString("title");
//img
JSONObject post_img=c.getJSONObject("thumbnail_images");
for (int j=0;j<post_img.length();j++)
{
JSONObject v=post_img.getJSONObject("mom-portfolio-two");
jsonContent.imgurl=v.getString("url");
}
jsonContent.pages=id;
listcontent.add(jsonContent);
}
} catch (final JSONException e) {
Log.e(TAG, "Json parsing error: " + e.getMessage());
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getActivity().getApplicationContext(),
"Json parsing error: " + e.getMessage(),
Toast.LENGTH_LONG)
.show();
}
});
}
} else {
Log.e(TAG, "Couldn't get json from server.");
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getActivity().getApplicationContext(),
"Couldn't get json from server. Check LogCat for possible errors!",
Toast.LENGTH_LONG)
.show();
}
});
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
pDialog.dismiss();
recyclerView=(RecyclerView)myFragmentView.findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
recyclerView.setLayoutManager(layoutManager);
adapter=new DataAdapter(getActivity(), listcontent, new AdapterCallback() {
@Override
public void MethodCallbackgo() {
String gg;
Bundle extras = getArguments();
gg = extras.getString("sag");
dog= Integer.parseInt(gg);
url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_posts";
new GetContacts().execute();
}
@Override
public void MethodCallbacknext() {
dog+=1;
url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_posts";
new GetContacts().execute();
}
@Override
public void MethodCallbackprev() {
if (dog!=1)
{
dog-=1;
url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_posts";
new GetContacts().execute();
}else{
Toast.makeText(getActivity().getApplicationContext(),"این اولین صفحه است",Toast.LENGTH_SHORT).show();
}
}
});
recyclerView.setAdapter(adapter);
}
}
private boolean isNetworkConnected() {
ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni == null) {
// There are no active networks.
return false;
} else
return true;
}
}
想要 go.setOnClickListener
中的内部适配器获取编辑文本值并将其传递给 public void MethodCallbackgo() {
中的片段,但没有用。另一个问题是如何将片段内的狗变量值发送到适配器?
如果理解正确,你想将数据从回调方法调用传递给接口实现。
使用参数
void MethodCallbackgo(String data);
传回去
etpass=String.valueOf(viewHolder.editText.getText());
callback.MethodCallbackgo(etpass);
另外:建议重写 AsyncTask 以将 URL 作为参数。 URL 不需要是 Fragment
的成员变量
@Override
public void MethodCallbackgo(String data) {
// here you have data
//use it ...
new GetContacts().execute(url); // pass url here, for example
}
这只会创建一个从未显示的全新片段
maghalat f1 = new maghalat ();
Bundle args1 = new Bundle();
args1.putString("sag",etpass);
f1.setArguments(args1);
不过,我个人认为适配器不应控制页码。片段(或其他一些 class)应包含 previous/next/go 按钮操作并相应地更新适配器。你给了 class“太多的责任”,它的唯一目的是在列表中显示数据。
在你的适配器中声明这个
private AdapterCallback mAdaptercallback;
在适配器中创建一个方法
public void setAdapterCallback(AdapterCallback adaptercallback){
this.mAdaptercallback = adaptercallback;
}
在你的片段中这样做
adapter.setAdapterCallback(new DataAdapter.AdapterCallback() {
@Override
public void MethodCallbackgo() {
String gg;
Bundle extras = getArguments();
gg = extras.getString("sag");
dog= Integer.parseInt(gg);
url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_posts";
new GetContacts().execute();
}
@Override
public void MethodCallbacknext() {
dog+=1;
url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_posts";
new GetContacts().execute();
}
@Override
public void MethodCallbackprev() {
if (dog!=1)
{
dog-=1;
url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_posts";
new GetContacts().execute();
}else{
Toast.makeText(getActivity().getApplicationContext(),"این اولین صفحه است",Toast.LENGTH_SHORT).show();
}
}
});
希望这能解决您的问题
查看关于此的所有 post 并理解在所有情况下人们解释如何使用接口将数据从适配器传递到片段,我使用它但我的问题是如何将数据从片段传递到适配器?以及如何传递这些数据的价值?
这是我的适配器:
public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> {
private Context context;
List<jsonContent> jcontent;
private AdapterCallback callback;
private String etpass;
public DataAdapter(Context context, List<jsonContent> jcontent, AdapterCallback callback) {
this.context=context;
this.jcontent=jcontent;
this.callback=callback;
}
@Override
public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view ;
if(i == R.layout.card_row) {
view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_row, viewGroup, false);
}else {
view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.button_card, viewGroup, false);
}
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int i) {
if(i == jcontent.size()) {
viewHolder.buttonnext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
jcontent.removeAll(jcontent);
callback.MethodCallbacknext();
}
});
viewHolder.buttonprev.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
jcontent.removeAll(jcontent);
callback.MethodCallbackprev();
}
});
viewHolder.go.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
etpass=String.valueOf(viewHolder.editText.getText());
maghalat f1 = new maghalat ();
Bundle args1 = new Bundle();
args1.putString("sag",etpass);
f1.setArguments(args1);
callback.MethodCallbackgo();
}
});
viewHolder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
viewHolder.pages.setText(Integer.toString(jcontent.get(i - 1).pages));
}
else {
viewHolder.title.setText(jcontent.get(i).title);
viewHolder.title.setTypeface(viewHolder.title.getTypeface(), Typeface.BOLD);
Picasso.with(context).load(jcontent.get(i).imgurl).resize(300, 400).into(viewHolder.imageView);
}
}
@Override
public int getItemCount() {
return jcontent.size()+1;
}
@Override
public int getItemViewType(int position) {
return (position == jcontent.size()) ? R.layout.button_card : R.layout.card_row;
}
public class ViewHolder extends RecyclerView.ViewHolder{
private TextView title,pages,current;
private ImageView imageView;
private Button buttonnext,buttonprev,go;
private CardView cardView;
private EditText editText;
public ViewHolder(final View view) {
super(view);
title = (TextView)view.findViewById(R.id.post_title);
imageView=(ImageView)view.findViewById(R.id.img);
buttonnext =(Button)view.findViewById(R.id.next);
buttonprev=(Button)view.findViewById(R.id.prev);
go=(Button)view.findViewById(R.id.go);
editText=(EditText)view.findViewById(R.id.et_go_page);
cardView=(CardView)view.findViewById(R.id.cvv);
pages=(TextView)view.findViewById(R.id.number_pages);
current=(TextView)view.findViewById(R.id.current);
}
}
}
这是我的界面:
public interface AdapterCallback {
void MethodCallbackgo();
void MethodCallbacknext();
void MethodCallbackprev();
}
这是我的片段:
public class maghalat extends Fragment {
private View myFragmentView;
private RecyclerView recyclerView;
private DataAdapter adapter;
private String TAG = MainActivity.class.getSimpleName();
private ProgressDialog pDialog;
List<jsonContent> listcontent=new ArrayList<>();
public int dog=1;
public String url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_posts";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
myFragmentView = inflater.inflate(R.layout.maghalat, container, false);
if(isNetworkConnected()) {
asyncRun();
}else
{
Toast.makeText(getActivity().getApplicationContext(), "دستگاه شما به اینترنت متصل نیست!", Toast.LENGTH_LONG).show();
}
return myFragmentView;
}
public void asyncRun(){
new GetContacts().execute();
}
public class GetContacts extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// Showing progress dialog
pDialog = new ProgressDialog(getActivity());
pDialog.setMessage("Please wait...");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected Void doInBackground(Void... arg0) {
HttpHandler sh = new HttpHandler();
// Making a request to url and getting response
String jsonStr = sh.makeServiceCall(url);
Log.e(TAG, "Response from url: " + jsonStr);
if (jsonStr != null) {
try {
JSONObject jsonObj = new JSONObject(jsonStr);
int id=jsonObj.getInt("pages");
JSONArray posts = jsonObj.getJSONArray("posts");
for (int i = 0; i < posts.length(); i++) {
JSONObject c = posts.getJSONObject(i);
jsonContent jsonContent=new jsonContent();
jsonContent.title=c.getString("title");
//img
JSONObject post_img=c.getJSONObject("thumbnail_images");
for (int j=0;j<post_img.length();j++)
{
JSONObject v=post_img.getJSONObject("mom-portfolio-two");
jsonContent.imgurl=v.getString("url");
}
jsonContent.pages=id;
listcontent.add(jsonContent);
}
} catch (final JSONException e) {
Log.e(TAG, "Json parsing error: " + e.getMessage());
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getActivity().getApplicationContext(),
"Json parsing error: " + e.getMessage(),
Toast.LENGTH_LONG)
.show();
}
});
}
} else {
Log.e(TAG, "Couldn't get json from server.");
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getActivity().getApplicationContext(),
"Couldn't get json from server. Check LogCat for possible errors!",
Toast.LENGTH_LONG)
.show();
}
});
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
pDialog.dismiss();
recyclerView=(RecyclerView)myFragmentView.findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
recyclerView.setLayoutManager(layoutManager);
adapter=new DataAdapter(getActivity(), listcontent, new AdapterCallback() {
@Override
public void MethodCallbackgo() {
String gg;
Bundle extras = getArguments();
gg = extras.getString("sag");
dog= Integer.parseInt(gg);
url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_posts";
new GetContacts().execute();
}
@Override
public void MethodCallbacknext() {
dog+=1;
url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_posts";
new GetContacts().execute();
}
@Override
public void MethodCallbackprev() {
if (dog!=1)
{
dog-=1;
url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_posts";
new GetContacts().execute();
}else{
Toast.makeText(getActivity().getApplicationContext(),"این اولین صفحه است",Toast.LENGTH_SHORT).show();
}
}
});
recyclerView.setAdapter(adapter);
}
}
private boolean isNetworkConnected() {
ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni == null) {
// There are no active networks.
return false;
} else
return true;
}
}
想要 go.setOnClickListener
中的内部适配器获取编辑文本值并将其传递给 public void MethodCallbackgo() {
中的片段,但没有用。另一个问题是如何将片段内的狗变量值发送到适配器?
如果理解正确,你想将数据从回调方法调用传递给接口实现。
使用参数
void MethodCallbackgo(String data);
传回去
etpass=String.valueOf(viewHolder.editText.getText());
callback.MethodCallbackgo(etpass);
另外:建议重写 AsyncTask 以将 URL 作为参数。 URL 不需要是 Fragment
的成员变量 @Override
public void MethodCallbackgo(String data) {
// here you have data
//use it ...
new GetContacts().execute(url); // pass url here, for example
}
这只会创建一个从未显示的全新片段
maghalat f1 = new maghalat ();
Bundle args1 = new Bundle();
args1.putString("sag",etpass);
f1.setArguments(args1);
不过,我个人认为适配器不应控制页码。片段(或其他一些 class)应包含 previous/next/go 按钮操作并相应地更新适配器。你给了 class“太多的责任”,它的唯一目的是在列表中显示数据。
在你的适配器中声明这个
private AdapterCallback mAdaptercallback;
在适配器中创建一个方法
public void setAdapterCallback(AdapterCallback adaptercallback){
this.mAdaptercallback = adaptercallback;
}
在你的片段中这样做
adapter.setAdapterCallback(new DataAdapter.AdapterCallback() {
@Override
public void MethodCallbackgo() {
String gg;
Bundle extras = getArguments();
gg = extras.getString("sag");
dog= Integer.parseInt(gg);
url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_posts";
new GetContacts().execute();
}
@Override
public void MethodCallbacknext() {
dog+=1;
url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_posts";
new GetContacts().execute();
}
@Override
public void MethodCallbackprev() {
if (dog!=1)
{
dog-=1;
url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_posts";
new GetContacts().execute();
}else{
Toast.makeText(getActivity().getApplicationContext(),"این اولین صفحه است",Toast.LENGTH_SHORT).show();
}
}
});
希望这能解决您的问题