0

我是新手,所以尽量对我有耐心

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

我有一个片段 ViewFragment,它由两个组件组成:一个 Spinner 和一个 ListView。Spinner 是具有常规 ArrayAdapter 的默认 Spinner,它使用从称为“metaList”的 ArrayList 获取的值填充 Spinner,该 ArrayList 基本上是对象的 ArrayList,每个对象都有一个称为“mainList”的 ArrayList。

ListView 具有我在标题中提到的自定义 ArrayAdapter(称为“CustomAdapter”)。CustomAdapter 使用从 Spinner 中选定项目的“mainList”中获取的值填充 ListView。

现在,ListView 的 CustomAdapter 有两个按钮。唯一可以做任何事情的按钮(称为“viewButton”)在按下时会创建一个 DialogFragment。

我遇到的问题与此 DialogFragment 有关。ListView 中的每个项目都应在其 viewButton 被按下时创建一个唯一的 DialogFragment。但是,无论 ListView 中的哪个项目按下其按钮,DialogFragment 始终相同,并显示 ListView 中最后一个项目的 DialogFragment。

我认为这个问题是由于 ListView 项目本身没有被按下,只有它们的按钮,所以 CustomAdapter 的 getView() 方法中的位置值从未真正改变。

我该如何解决这个问题?

下面是包含 Spinner 和 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;
    }
}
}

这是 CustomAdapter 的代码:

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

}

这是 DialogFragment 的代码,称为 NumStatDialog:

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

这里有一些截图让事情更容易理解。微调器位于顶部,ListView 位于其正下方。每个 ListView 项的第一个数字是它的位置,第二个数字是 Spinner 的位置。感兴趣的按钮是纸形按钮。忽略铅笔,它还没有做任何事情。

在此处输入图像描述

这是一个DialogFragment。标题是 Spinner 位置,底部数字是按钮被按下的项目的位置,但请注意,即使 ListView 上的第一个项目按下按钮以显示此对话框,片段底部的数字也会显示第 4 项为三。

在此处输入图像描述

对此问题的任何帮助将不胜感激,这是我需要为这个项目克服的最后一个主要障碍之一,其他一切都应该是非常基本的。谢谢!

4

1 回答 1

1

在您的showContents()中,您完全忽略传入的两个参数,而是使用this.pos,这确实是由ListView. 只需使用您的参数(并设置您的 IDE 以警告您未使用的变量和参数)。

另一方面,将数据传递给像这样的片段将无法在配置更改后保留下来(除非你setRetainInstance到处都有,但这充满了不同类型的问题)。考虑使用setArguments,序列化状态onSaveInstanceState并反序列化onCreate(使用getArgumentsor savedInstanceState,如果可用)。

于 2013-06-16T20:11:09.520 回答