Java Android ListView的具体用法

Java Android ListView的具体用法,java,android,json,listview,Java,Android,Json,Listview,我正在用一个json请求填充一个自定义ListView(我指的是一个特定的布局),我想实现一个ListView监听器。所以我这样做了: ListView lv = (ListView) findViewById(R.id.MessageList); lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() { @Override public void o

我正在用一个json请求填充一个自定义ListView(我指的是一个特定的布局),我想实现一个ListView监听器。所以我这样做了:

ListView lv = (ListView) findViewById(R.id.MessageList);
    lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {


        }
    });
ListView lv=(ListView)findViewById(R.id.MessageList);
setOnItemClickListener(新的android.widget.AdapterView.OnItemClickListener(){
@凌驾
公共视图单击(AdapterView arg0、视图arg1、整型arg2、长型arg3){
}
});
我的问题是,我想利用ListView的选定项,但我只能知道选择了哪一项(第一项、第二项等),我想将我的数据库ID(通过json反序列化获得的主键)与ListView ID相关联,或者类似的东西

有没有办法做到这一点


致以最诚挚的问候。

创建视图时,请将数据库id设置为视图上的标记。在onclick中,可以调用arg1.getTag()并获取该值。

确保
MyClassWithGettersSetters
包含所需的数据库id

然后您可以访问以下项目:

ListView lv = (ListView) findViewById(R.id.MessageList);
lv.setAdapter(myAdapter);
lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        MyClassWithGettersSetters objectClicked = (MyClassWithGettersSetters) myAdapter.getItem(arg2);
        Log.d(TAG, "Clicked on object: " + objectClicked);
        objectClicked.getDBID(); // you now have access to the specific object and id
        // do whatever you need to do
    }
});
ListView lv=(ListView)findViewById(R.id.MessageList);
lv.设置适配器(myAdapter);
setOnItemClickListener(新的android.widget.AdapterView.OnItemClickListener(){
@凌驾
公共视图单击(AdapterView arg0、视图arg1、整型arg2、长型arg3){
MyClassWithGettersSetters对象单击=(MyClassWithGettersSetters)myAdapter.getItem(arg2);
Log.d(标记“单击对象:”+objectClicked);
objectClicked.getDBID();//您现在可以访问特定的对象和id
//做你需要做的事
}
});

在适配器中,覆盖
getItemId()
以返回您正在使用的Id: (在本例中,适配器在JSONObject上工作,您的id是json对象中键“id”所引用的长id)


这样,在您的
onItemClickListener
中,
arg3
实际上是单击项目的id。

ListView可以接受任何类型的对象。将您需要的所有内容(包括ID等)封装在您创建的类中,并在listview.Hi中使用这些对象。已经为这个ListView使用了一个类,您想让我添加一个int id;(使用getter和setter)是的-ListView应该只用于显示和交互,因此您应该传递
List
s,以及您需要传递给它们的所有内容。我不知道你在做什么,但看起来你需要一些id字段。如果您愿意,我可以在回答中详细说明。我正在建模消息,因为消息很短,包含作者、消息、日期和唯一ID。我正在使用ArrayList和MyClassWithGettersSetters类的实例。在每条消息之间,我执行ArrayList.add(Instance);最后是listView.setAdapter和自定义适配器。我可以链接你的代码,如果它可能有帮助…我已经发布了一个答案-让我知道如果它没有意义。。。显然我在猜测,但基本上你可以在onclick中获得你想要的项目…因此,只要该项目包含你需要的id(在你创建列表/项目之前设置)…你就应该是金色的!您好,在创建ListView时,我应该在您返回的视图上应用setTag吗。你的convertview。好的,那么witch方法可以给我当前的视图吗?我想我可以用这个解决方案获胜。onclick将为您提供您单击的视图。好的,这有两个小问题。。。首先,“lv.setAdapter(myAdapter.class)”抛出一个错误:“类型ListView中的方法setAdapter(ListAdapter)不适用于参数(类)”。另外,我的代码中不存在myAdapter的get方法,这是什么?谢谢。我的意思是getItem()-我假设您正在扩展BaseAdapter以创建自定义适配器。不管怎样,祝你好运!考虑封装这个类中你需要的所有东西,我不知道为什么ID不在那里,我会把它们放在那里。嗨,我试过这个解决方案,“不能调用OptLon(String)在原始类型int上”,看起来OptLon需要一个字符串…显然你的项目是int,但是我不能说更多的而不看到你的实际适配器…(显然,盲代码需要一些调整…)
@Override
public long getItemId(int position) {
    return getItem(position).optLong("id");
}