gpt4 book ai didi

android - 在没有自定义数组适配器的情况下提供 ListView 项目标签

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:21:40 25 4
gpt4 key购买 nike

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

我正在使用 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);
}

但是这个 ListView 似乎是空的,即使已经设置了适配器。

我不能使用自定义 ArrayAdapter,因为当某个项目被放下或滑开时应用程序会崩溃。

附加信息:当服务使用 BroadcastReceiver 返回数据时,将填充 ListView 。我认为这不会影响这一点,但你永远不会知道。

我的问题:

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

提前致谢!

最佳答案

如果你不想使用自定义的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() 方法。 toString() 方法在 ListView 想要填充其数据的提供的对象上调用。

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。

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

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

关于android - 在没有自定义数组适配器的情况下提供 ListView 项目标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17284192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com