Java 由来自自定义ArrayAdapter中按钮的事件创建的DialogFragment始终具有相同的位置
我是新手,所以试着对我有耐心 以下是我遇到的问题的一些背景信息: 我有一个片段,ViewFragment,它由两个组件组成:一个微调器和一个ListView。微调器是一个默认微调器,具有一个常规的ArrayAdapter,该微调器使用从名为“metaList”的ArrayList中获取的值填充微调器,该列表基本上是一个对象的ArrayList,每个对象本身都有一个名为“mainList”的ArrayList ListView具有我在标题中提到的自定义ArrayAdapter(称为“CustomAdapter”)。CustomAdapter使用微调器中选定项的“mainList”中的值填充ListView 现在,ListView的CustomAdapter有两个按钮。唯一可以执行任何操作的按钮(称为“viewButton”)在按下时会创建一个DialogFragment 我遇到的问题与此对话片段有关。当ListView中的每个项目的viewButton被按下时,它都应该创建一个唯一的DialogFragment。但是,无论ListView中的哪个项目按下了按钮,DialogFragment始终是相同的,并显示ListView中最后一个项目的DialogFragment 我认为这个问题是由于ListView项本身没有被按下,只有它们的按钮,因此CustomAdapter的getView()方法中的位置值从未真正改变 如何解决此问题 以下是包含微调器和ListView组件的ViewFragment的代码:Java 由来自自定义ArrayAdapter中按钮的事件创建的DialogFragment始终具有相同的位置,java,android,android-listview,android-arrayadapter,android-dialogfragment,Java,Android,Android Listview,Android Arrayadapter,Android Dialogfragment,我是新手,所以试着对我有耐心 以下是我遇到的问题的一些背景信息: 我有一个片段,ViewFragment,它由两个组件组成:一个微调器和一个ListView。微调器是一个默认微调器,具有一个常规的ArrayAdapter,该微调器使用从名为“metaList”的ArrayList中获取的值填充微调器,该列表基本上是一个对象的ArrayList,每个对象本身都有一个名为“mainList”的ArrayList ListView具有我在标题中提到的自定义ArrayAdapter(称为“CustomA
package com.statbot;
import java.util.ArrayList;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.AdapterView.OnItemSelectedListener;
public class ViewFragment extends Fragment{
static int spinPos;
private ArrayList<String> names;
private ArrayList<String> nums;
private Spinner spinner;
private View view;
private ViewGroup container;
private ListView listView;
private Fragment frag;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.view_layout, container, false);
this.container = container;
frag = this;
names = new ArrayList<String>();
nums = new ArrayList<String>();
spinner = (Spinner)view.findViewById(R.id.view_frag_spinner1);
listView = (ListView) view.findViewById(R.id.view_frag_listView2);
for(int k = 0; k < MainActivity.metaList.size(); k++)
{
names.add(MainActivity.metaList.get(k).getName());
}
ArrayAdapter<String> adapter = new ArrayAdapter<String> (container.getContext(),android.R.layout.simple_spinner_item, names);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new SpinListener());
return view;
}
private class SpinListener extends Activity implements OnItemSelectedListener{
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos,
long id) {
// TODO Auto-generated method stub
spinPos = pos;
nums.clear();
for(int k = 0; k < MainActivity.metaList.get(pos).mainList.size(); k++)
{
nums.add("" + MainActivity.metaList.get(pos).mainList.get(k).quantity);
}
CustomAdapter adapter2 = new CustomAdapter(container.getContext(), android.R.layout.simple_spinner_item, nums);
adapter2.setFrag(frag);
listView.setAdapter(adapter2);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
spinPos = 0;
}
}
}
下面是一些屏幕截图,让事情更容易理解。微调器位于顶部,ListView位于其正下方。每个ListView项的第一个数字是其位置,第二个数字是微调器的位置。感兴趣的按钮是纸质的。别理铅笔,它什么都没用
这是一个对话片段。标题是微调器位置,底部数字是按钮被按下的项目的位置,但请注意,即使ListView上的第一个项目被按下按钮以显示此对话框,片段底部的数字显示第四个项目的三
在这个问题上的任何帮助都将不胜感激,这是我需要为这个项目克服的最后一个主要障碍之一,其他一切都应该是非常基本的。
谢谢 在您的showContents()
中,您完全忽略传入的两个参数,而是使用this.pos
,这确实是列表视图所膨胀的最后一个视图的位置。只需使用您的参数(并设置IDE以警告您未使用的变量和参数)
另一方面,将数据传递给这样的片段不会在配置更改后继续存在(除非您到处都有setRetainInstance
,但这其中有各种各样的问题)。考虑使用<代码>设置参数< /> >,在“代码> OnSaveStistChansWeb/Cudio>中序列化状态,并在<代码> OnCudio中使用反序列化(使用<代码> GETCONTION< /COD>或<代码> SaveDestChansEng/<代码>,如果可用的话)。p> 哇,谢谢,这是唯一的问题。真不敢相信我犯了那个错误。然而,我不太明白你回答的第二部分。你能解释一下什么是“序列化”吗?序列化指的是保存和恢复对象的统一方式。在普通Java中,这是通过可序列化接口完成的。在Android Java中,首选的方式是可打包和捆绑。我的实际意思是,您应该将实例变量(即字段)保存在onSaveInstanceState
中,并从onCreate
中的savedInstanceState
中还原它们。这样,您就知道,无论Android决定对您的片段和活动做什么,您的状态都可以得到一致的保存和恢复,您将得到保护。
package com.statbot;
import java.util.List;
import android.app.Fragment;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
public class CustomAdapter extends ArrayAdapter{
private TextView quantity;
private ImageButton editButton;
private ImageButton deleteButton;
private ImageButton viewButton;
private Context mContext;
private int id;
private Fragment frag;
private int pos;
private List<String> objects;
@SuppressWarnings("unchecked")
public CustomAdapter (Context context, int textViewResourceId, List<String> objects){
super(context, textViewResourceId, objects);
mContext = context;
id = textViewResourceId;
this.objects = objects;
}
public View getView(int position, View v, ViewGroup parent){
this.pos = position;
final int POSITION = position;
View mView = v;
if (mView == null){
LayoutInflater vi = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mView = vi.inflate(R.layout.cust_list_view, parent, false);
}
editButton = (ImageButton) mView.findViewById(R.id.cust_list_view_button1);
viewButton = (ImageButton) mView.findViewById(R.id.cust_list_view_button2);
quantity = (TextView) mView.findViewById(R.id.cust_list_view_textView1);
if(quantity == null)
{
System.out.println("The poop is a lie");
}
quantity.setText("" + pos + "," + ViewFragment.spinPos);
viewButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
System.out.println("" + POSITION);
showContents(ViewFragment.spinPos, POSITION);
}
});
return mView;
}
private void showContents(int metaPos, int mainPos){
NumStatDialog contents = new NumStatDialog();
contents.setMainPosition(pos);
contents.setMetaPosition();
contents.show(frag.getFragmentManager(), "content_dialog");
}
public void setFrag(Fragment f){
frag = f;
}
}
package com.statbot;
import android.annotation.SuppressLint;
import android.app.DialogFragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
@SuppressLint("ValidFragment")
public class NumStatDialog extends DialogFragment{
private View view;
private int metaPosition;
private int mainPosition;
private TextView title;
private TextView info;
private boolean type;//if true, sets up a dialog to display information on a list. if false, displays information on an item of that list.
public NumStatDialog(int metaPos, int mainPos){
type = false;
metaPosition = metaPos;
mainPosition = mainPos;
}
public NumStatDialog(int metaPos){
type = true;
metaPosition = metaPos;
}
public NumStatDialog(){
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.numstat_dialog_layout, container);
info = (TextView) view.findViewById(R.id.numstat_dialog_textView2);
title = (TextView) view.findViewById(R.id.numstat_dialog_textView1);
if(!type){
//info.setText((CharSequence) MainActivity.metaList.get(metaPosition).mainList.get(mainPosition).toString());
info.setText((CharSequence) ("" + mainPosition));
//title.setText((CharSequence) ("" + MainActivity.metaList.get(metaPosition).mainList.get(mainPosition).quantity));
title.setText((CharSequence) ("" + metaPosition));
}
if(type){
info.setText((CharSequence) MainActivity.metaList.get(metaPosition).toString());
title.setText((CharSequence) MainActivity.metaList.get(metaPosition).getName());
}
return view;
}
public void setMainPosition(int mp){
mainPosition = mp;
}
public void setMetaPosition(){
metaPosition = ViewFragment.spinPos;
}
}