我希望将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);
}
代码似乎工作正常,我觉得它有点草率。如果有人能想出一个更加清晰的解决方案,如果没有,那么我会在可以接受时将其添加为答案
答案 0 :(得分:1)
你至少有两个问题:
要使用getSectionForPosition()
,您的Adapter
必须实施SectionIndexer
界面。 ArrayAdapter<>
没有。所有MergeAdapter
都会尝试使用传递给它的任何SectionIndexer
实现,并且您已经通过零实现。
您正试图在Adapter
内多次重复使用相同的MergeAdapter
实例,我不知道这是否有用,当然不推荐它。
要解决这些问题,请为每个部分创建单独的适配器,并让这些适配器实现SectionIndexer
。