MergeAdapter - 无法检索节位置

时间:2013-08-27 07:58:22

标签: android commonsware-cwac

我希望将MergeAdapter集成到我的项目中,我在尝试检索用户点击的部分时遇到问题。我想设置它,所以当用户点击任何部分中的任何项目时,会返回部分编号,因此我知道用户所在的部分。我正在处理的应用程序需要这个。

下面的代码设置了3个部分,每个部分都有一些数据。

public class SectionTesting extends Activity
{

    ListView listView;
    private MergeAdapter mergeAdapter = null;

    private static final String[] items =
    { "One", "Two", "Three" };

    Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mergelayout);

        context = this;

        listView = (ListView) findViewById(R.id.mergeListView);

        mergeAdapter = new MergeAdapter();

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, new ArrayList<String>(
                        Arrays.asList(items)));

        TextView sectionHeader = new TextView(this);
        sectionHeader.setText("Section One");

        mergeAdapter.addView(sectionHeader);
        mergeAdapter.addAdapter(adapter);

        TextView sectionHeaderTwo = new TextView(this);
        sectionHeaderTwo.setText("Section Two");

        mergeAdapter.addView(sectionHeaderTwo);
        mergeAdapter.addAdapter(adapter);

        TextView sectionHeaderThree = new TextView(this);
        sectionHeaderThree.setText("Section Three");

        mergeAdapter.addView(sectionHeaderThree);
        mergeAdapter.addAdapter(adapter);

        listView.setAdapter(mergeAdapter);

        listView.setOnItemClickListener(new OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> arg0, View v, int position,
                    long arg3)
            {
                Toast.makeText(
                        context,
                        "You clicked Section "
                                + mergeAdapter.getSectionForPosition(position),
                        Toast.LENGTH_SHORT).show();

            }

        });
    }

}

我希望getSectionForPosition方法会返回我需要的值,但它每次都返回0。我尝试调用方法getSections()。length以检查它是否返回了正确数量的部分,但每次都返回0。

任何帮助都将非常感谢!!

修改

我设法提出了这个混乱的解决方案。在MergeAdapter类中,在addView方法下,我添加了这行代码

view.setId(1000);

然后我在这里添加了这个方法

public int getSectionNumber(int position)
    {
        int section = 0;

        for (ListAdapter piece : getPieces())
        {
            int size = piece.getCount();

            if (position < size)
            {
                return section-=1;
            }

            position -= size;

            if(size == 1)
            {
                if(piece.getItem(0) instanceof TextView)
                {
                    TextView tv = (TextView) piece.getItem(0);
                    if(tv.getId() == 1000)
                    {
                        section++;  
                    }
                }       
            }
        }

        return (-1);
    }

代码似乎工作正常,我觉得它有点草率。如果有人能想出一个更加清晰的解决方案,如果没有,那么我会在可以接受时将其添加为答案

1 个答案:

答案 0 :(得分:1)

你至少有两个问题:

  1. 要使用getSectionForPosition(),您的Adapter必须实施SectionIndexer界面。 ArrayAdapter<>没有。所有MergeAdapter都会尝试使用传递给它的任何SectionIndexer实现,并且您已经通过零实现。

  2. 您正试图在Adapter内多次重复使用相同的MergeAdapter实例,我不知道这是否有用,当然不推荐它。

  3. 要解决这些问题,请为每个部分创建单独的适配器,并让这些适配器实现SectionIndexer