Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 由来自自定义ArrayAdapter中按钮的事件创建的DialogFragment始终具有相同的位置_Java_Android_Android Listview_Android Arrayadapter_Android Dialogfragment - Fatal编程技术网

Java 由来自自定义ArrayAdapter中按钮的事件创建的DialogFragment始终具有相同的位置

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

我是新手,所以试着对我有耐心

以下是我遇到的问题的一些背景信息:

我有一个片段,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的代码:

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