给出listview项标签,不带自定义arrayadapter

时间:2013-06-24 20:09:17

标签: android listview android-arrayadapter

我有一个应该简单的问题,但我似乎无法解决它。

我正在使用DragSortListView。我想给每个listview-item一个带有它原始位置的标签。当用户完成重新排序时,我想返回一个带有原始id的字符串(例如2,3,4,1如果用户将第一个项目移动到最后一个位置)。如果项目被删除,我也想知道原始ID。

这是我的代码。

DragSortListView mainListView = (DragSortListView) findViewById( R.id.list_pages );  
String[] names = settings.getString("pages", "Error,error").split(",");    
ArrayList<String> list = new ArrayList<String>(Arrays.asList(names));
adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.row, list);
mainListView.setAdapter(adapter);
DragSortController controller = new DragSortController(mainListView);
...

现在我认为最好循环浏览所有项目并为其添加标签及其原始ID。我试图使用类似的东西来遍历项目

for (int i = 0; i < mainListView.getCount(); i++)
{
  View v = mainListView.getChildAt(i);
  TextView tx = (TextView) v.findViewById(R.id.text);
  tx.setTag(i);
}

但是,即使已设置适配器,此列表视图也显示为空。

我无法使用自定义ArrayAdapter,因为当项目被删除或刷掉时,应用会崩溃。

其他信息: 当使用BroadcastReceiver的服务返回数据时,将填充列表视图。我不认为这会影响到这一点,但你永远不会知道。

我的问题:

  • 如何存储每个列表项原始位置,以便我以后可以访问它?

提前致谢!

1 个答案:

答案 0 :(得分:8)

如果您不想使用自定义Adapter,那么您可以这样做:

    List<Item> dataForTheAdapter = new ArrayList<Item>();

    // 'dataRetrivedfromService' is the data, that gets returned by the service
    for (int counter = 0; counter < dataRetrivedfromService.size(); counter++) {
        dataForTheAdapter.add(new Item(dataRetrivedfromService.get(counter), counter));
    }

    mContext = MyActivity.this;
    mAdapter = new ArrayAdapter<Item>(mContext, R.layout.row, dataForTheAdapter);

    ListView listView = (ListView) findViewById(R.id.listView);
    listView.setAdapter(mAdapter);

这段代码非常自我解释。现在看一下Item.java类,你会发现我覆盖了toString()方法。在ListView希望用其填充数据的提供对象上调用toString()方法。

public class Item {

    private String mText;
    private int mPosition;

    public Item(String text, int position) {

        this.mText = text;
        this.mPosition = position;
    }

    public int getPosition() {

        return mPosition;
    }

    public void setPosition(int position) {

        this.mPosition = position;
    }

    public String getText() {

        return mText;
    }

    public void setText(String text) {

        this.mText = text;
    }

    @Override
    public String toString() {

        return this.mText;
    }
}

现在您不必编写自定义适配器,但可以使用Item的对象填充ListView。

要测试它是否有效,您可以在OnItemClickListener上设置ListView并执行此操作:

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                Toast.makeText(mContext, String.valueOf(mAdapter.getItem(position).getPosition()), Toast.LENGTH_SHORT).show();
            }
        });